{"id":14,"date":"2026-04-24T19:58:10","date_gmt":"2026-04-24T19:58:10","guid":{"rendered":"http:\/\/h000001.hotelscsm.panoram4.com\/restaurante-2\/"},"modified":"2026-08-04T11:34:15","modified_gmt":"2026-08-04T11:34:15","slug":"laundry-dry-cleaning","status":"publish","type":"page","link":"https:\/\/h000001.hotelscsm.panoram4.com\/ca\/laundry-dry-cleaning\/","title":{"rendered":"Roba i Tintoreria"},"content":{"rendered":"<style>.kadence-column82_561d7c-9c > .kt-inside-inner-col{display:flex;}.kadence-column82_561d7c-9c > .kt-inside-inner-col{padding-top:var(--global-kb-spacing-xs, 1rem);padding-right:var(--global-kb-spacing-sm, 1.5rem);padding-bottom:var(--global-kb-spacing-xs, 1rem);padding-left:var(--global-kb-spacing-sm, 1.5rem);}.kadence-column82_561d7c-9c > .kt-inside-inner-col,.kadence-column82_561d7c-9c > .kt-inside-inner-col:before{border-top-left-radius:30px;border-top-right-radius:30px;border-bottom-right-radius:30px;border-bottom-left-radius:30px;}.kadence-column82_561d7c-9c > .kt-inside-inner-col{row-gap:var(--global-kb-gap-sm, 1rem);column-gap:var(--global-kb-gap-sm, 1rem);}.kadence-column82_561d7c-9c > .kt-inside-inner-col{flex-direction:column;justify-content:space-between;align-items:flex-start;}.kadence-column82_561d7c-9c > .kt-inside-inner-col > .kb-image-is-ratio-size{align-self:stretch;}.kadence-column82_561d7c-9c > .kt-inside-inner-col > .wp-block-kadence-advancedgallery{align-self:stretch;}.kadence-column82_561d7c-9c > .kt-inside-inner-col > .aligncenter{width:100%;}.kt-row-column-wrap > .kadence-column82_561d7c-9c{align-self:center;}.kt-inner-column-height-full:not(.kt-has-1-columns) > .wp-block-kadence-column.kadence-column82_561d7c-9c{align-self:auto;}.kt-inner-column-height-full:not(.kt-has-1-columns) > .wp-block-kadence-column.kadence-column82_561d7c-9c > .kt-inside-inner-col{flex-direction:column;justify-content:space-between;}.kadence-column82_561d7c-9c > .kt-inside-inner-col{background-color:rgba(0, 0, 0, 0.7);}.kadence-column82_561d7c-9c > .kt-inside-inner-col:before{opacity:0.3;}.kadence-column82_561d7c-9c{text-align:left;}.kadence-column82_561d7c-9c{position:relative;}.kadence-column82_561d7c-9c, .kt-inside-inner-col > .kadence-column82_561d7c-9c:not(.specificity){margin-top:0px;margin-right:var(--global-kb-spacing-lg, 3rem);margin-bottom:0px;margin-left:var(--global-kb-spacing-lg, 3rem);}@media all and (max-width: 1024px){.kadence-column82_561d7c-9c > .kt-inside-inner-col{padding-right:var(--global-kb-spacing-sm, 1.5rem);padding-left:var(--global-kb-spacing-sm, 1.5rem);row-gap:var(--global-kb-gap-sm, 1rem);flex-direction:column;justify-content:flex-start;align-items:flex-start;}}@media all and (max-width: 1024px){.kt-row-column-wrap > .kadence-column82_561d7c-9c{align-self:flex-start;}}@media all and (max-width: 1024px){.kt-inner-column-height-full:not(.kt-has-1-columns) > .wp-block-kadence-column.kadence-column82_561d7c-9c{align-self:auto;}}@media all and (max-width: 1024px){.kt-inner-column-height-full:not(.kt-has-1-columns) > .wp-block-kadence-column.kadence-column82_561d7c-9c > .kt-inside-inner-col{flex-direction:column;justify-content:flex-start;}}@media all and (max-width: 1024px){.kadence-column82_561d7c-9c, .kt-inside-inner-col > .kadence-column82_561d7c-9c:not(.specificity){margin-top:var(--global-kb-spacing-sm, 1.5rem);margin-right:0px;margin-left:0px;}}@media all and (max-width: 767px){.kadence-column82_561d7c-9c > .kt-inside-inner-col{padding-right:var(--global-kb-spacing-sm, 1.5rem);padding-left:var(--global-kb-spacing-sm, 1.5rem);row-gap:var(--global-kb-gap-sm, 1rem);flex-direction:column;justify-content:flex-start;align-items:flex-start;}.kt-row-column-wrap > .kadence-column82_561d7c-9c{align-self:flex-start;}.kt-inner-column-height-full:not(.kt-has-1-columns) > .wp-block-kadence-column.kadence-column82_561d7c-9c{align-self:auto;}.kt-inner-column-height-full:not(.kt-has-1-columns) > .wp-block-kadence-column.kadence-column82_561d7c-9c > .kt-inside-inner-col{flex-direction:column;justify-content:flex-start;}.kadence-column82_561d7c-9c{text-align:left;}}<\/style>\n<div class=\"wp-block-kadence-column kadence-column82_561d7c-9c kb-section-md-dir-vertical kb-section-sm-dir-vertical\"><div class=\"kt-inside-inner-col\"><h2 style=\"padding-right:0;padding-left:0;margin-top:0;margin-bottom:0;\" class=\"has-link-color wp-elements-37e35236f95abae064b244f5f36d7d9f wp-block-post-title has-text-color has-theme-palette-9-color\">Laundry &amp; Dry Cleaning<\/h2>\n\n\n    <div class=\"services-main-container\">\n        \n    <style>\n\n        .services-main-container {\n            display:flex;\n            flex-direction:column;\n            width:100%;\n            height:481px;\n        }\n\n        \/* Compatibilidad con el navegador de los STB (Chrome 49): ni gap ni grid\n           ni aspect-ratio. Ver roomcms-legacy-shims.php para el porque. *\/\n        .services-filter-wrap {\n            display:flex;\n            flex-wrap:wrap;\n            margin:0 -5px 15px;\n        }\n        .services-filter-wrap > .filter-btn { margin:0 5px 10px; }\n\n        .filter-btn {\n            background:transparent;\n            border:2px solid #ffffff;\n            color:#ffffff;\n            padding:5px 20px;\n            border-radius:30px;\n            cursor:pointer;\n            font-size:21px;\n            transition:all 0.3s ease;\n        }\n\n        .filter-btn:hover {\n            border: 2px solid #5ec8e9 !important;\n            background-color: transparent;\n            color: white;\n            outline: none;\n        }\n\n        .filter-btn.active {\n            background:#ffffff;\n            color:#000000;\n        }\n\n        .services-grid-scroll {\n            flex-grow:1;\n            overflow-y:auto;\n            overflow-x:hidden;\n            padding-inline:10px;\n        }\n\n        .services-grid-scroll::-webkit-scrollbar {\n            width:6px;\n        }\n\n        .services-grid-scroll::-webkit-scrollbar-thumb {\n            background:#ffffff;\n            border-radius:10px;\n        }\n\n        \/* 7 columnas con calle de 20px: cada tarjeta ocupa un septimo menos la\n           calle, con 10px de margen a cada lado, y el contenedor compensa con\n           -10px para que la primera y la ultima queden a ras. *\/\n        .services-grid-container {\n            display:flex;\n            flex-wrap:wrap;\n            margin:0 -10px -20px;\n        }\n\n        .service-card {\n            width:calc(14.2857% - 20px);\n            margin:0 10px 20px;\n            box-sizing:border-box;\n            min-width:0;\n            background-size:cover;\n            background-position:center;\n            border-radius:15px;\n            display:flex;\n            align-items:flex-end;\n            padding:15px;\n            transition:transform 0.3s ease;\n        }\n\n        .service-card:hover {\n            transform: scale(1.02);\n        }\n\n        \/* sustituye a aspect-ratio:1\/1 : un espaciador de ancho cero cuyo\n           padding-top del 100% se resuelve contra el ancho de la tarjeta. *\/\n        .service-card::before { content:\"\"; display:block; width:0; padding-top:100%; }\n\n        .service-card-info {\n            text-align:right;\n            width:100%;\n            color:#ffffff;\n        }\n\n        .service-price {\n            margin:0;\n            font-size:21px;\n        }\n\n        .service-title {\n            margin:0;\n            font-size:24px;\n            font-weight:normal;\n            line-height:1.2;\n            color:white;\n        }\n\n        .kiosk-back-button  {\n            display: inline-flex;\n            align-items: center;\n            padding: 7px 32px;\n            border: 2px solid #ffffff;\n            background: transparent;\n            color: #ffffff;\n            border-radius: 40px;\n            cursor: pointer;\n            font-size: 21px;\n            transition: 0.3s;\n            width: fit-content;\n            margin-top: 20px;\n        }\n\n        .kiosk-back-button:hover, .kiosk-back-button:active, .kiosk-back-button:focus {\n            box-shadow: none;\n            background: transparent;\n        }\n\n        .kiosk-back-button.keyboard-selected,\n        .kiosk-back-button.kiosk-keyboard-selected {\n            border: 2px solid #5ec8e9 !important;\n            z-index: 20;\n        }\n\n        .filter-btn.keyboard-selected {\n            border: 2px solid #5ec8e9 !important;\n            outline: none;\n        }\n\n        .service-card.keyboard-selected {\n            transform: scale(1.02);\n        }\n\n        @media (max-width: 1200px) {\n            .service-card { width:calc(25% - 20px); }\n        }\n\n        @media (max-width: 992px) {\n            .service-card { width:calc(33.3333% - 20px); }\n        }\n\n        @media (max-width: 768px) {\n            .service-card { width:calc(50% - 20px); }\n        }\n\n    <\/style>\n        <div class=\"services-filter-wrap\">\n        <button class=\"filter-btn active\" data-filter=\"all\">\n            All\n        <\/button><\/div>\n        \n    <div class=\"services-grid-scroll\">\n        <div class=\"services-grid-container\">\n        <a href=\"https:\/\/h000001.hotelscsm.panoram4.com\/ca\/services\/blouse\/\"\n           data-no-translation-href\n           class=\"service-card \"\n           style=\"\n                background-image:\n                linear-gradient(rgba(0,0,0,0.1), rgba(0,0,0,0.7)),\n                url(https:\/\/h000001.hotelscsm.panoram4.com\/wp-content\/uploads\/sites\/18\/2026\/05\/magnific_sophisticated-and-natural_2966214697.jpeg);\n                text-decoration:none;\n           \">\n\n            <div class=\"service-card-info\">\n\n                <p class=\"service-price\">\n                    10\u20ac\n                <\/p>\n\n                <h3 class=\"service-title\">\n                    Blouse\n                <\/h3>\n\n            <\/div>\n\n        <\/a>\n        <a href=\"https:\/\/h000001.hotelscsm.panoram4.com\/ca\/services\/coat-jacket-or-trench-coat\/\"\n           data-no-translation-href\n           class=\"service-card \"\n           style=\"\n                background-image:\n                linear-gradient(rgba(0,0,0,0.1), rgba(0,0,0,0.7)),\n                url(https:\/\/h000001.hotelscsm.panoram4.com\/wp-content\/uploads\/sites\/18\/2026\/05\/magnific_sophisticated-and-natural_2965329645.jpeg);\n                text-decoration:none;\n           \">\n\n            <div class=\"service-card-info\">\n\n                <p class=\"service-price\">\n                    21\u20ac\n                <\/p>\n\n                <h3 class=\"service-title\">\n                    Coat, jacket, or trench coat\n                <\/h3>\n\n            <\/div>\n\n        <\/a>\n        <a href=\"https:\/\/h000001.hotelscsm.panoram4.com\/ca\/services\/pajamas\/\"\n           data-no-translation-href\n           class=\"service-card \"\n           style=\"\n                background-image:\n                linear-gradient(rgba(0,0,0,0.1), rgba(0,0,0,0.7)),\n                url(https:\/\/h000001.hotelscsm.panoram4.com\/wp-content\/uploads\/sites\/18\/2026\/05\/magnific_sophisticated-dark-pink-c_2966390582.jpeg);\n                text-decoration:none;\n           \">\n\n            <div class=\"service-card-info\">\n\n                <p class=\"service-price\">\n                    10\u20ac\n                <\/p>\n\n                <h3 class=\"service-title\">\n                    Pajamas\n                <\/h3>\n\n            <\/div>\n\n        <\/a>\n        <a href=\"https:\/\/h000001.hotelscsm.panoram4.com\/ca\/services\/pants-skirts\/\"\n           data-no-translation-href\n           class=\"service-card \"\n           style=\"\n                background-image:\n                linear-gradient(rgba(0,0,0,0.1), rgba(0,0,0,0.7)),\n                url(https:\/\/h000001.hotelscsm.panoram4.com\/wp-content\/uploads\/sites\/18\/2026\/05\/magnific_sophisticated-product-pho_2964748783.jpeg);\n                text-decoration:none;\n           \">\n\n            <div class=\"service-card-info\">\n\n                <p class=\"service-price\">\n                    12\u20ac\n                <\/p>\n\n                <h3 class=\"service-title\">\n                    Pants, skirts\n                <\/h3>\n\n            <\/div>\n\n        <\/a>\n        <a href=\"https:\/\/h000001.hotelscsm.panoram4.com\/ca\/services\/shirt\/\"\n           data-no-translation-href\n           class=\"service-card \"\n           style=\"\n                background-image:\n                linear-gradient(rgba(0,0,0,0.1), rgba(0,0,0,0.7)),\n                url(https:\/\/h000001.hotelscsm.panoram4.com\/wp-content\/uploads\/sites\/18\/2026\/05\/magnific_sophisticated-and-natural_2966198231.jpeg);\n                text-decoration:none;\n           \">\n\n            <div class=\"service-card-info\">\n\n                <p class=\"service-price\">\n                    10\u20ac\n                <\/p>\n\n                <h3 class=\"service-title\">\n                    Shirt\n                <\/h3>\n\n            <\/div>\n\n        <\/a>\n        <a href=\"https:\/\/h000001.hotelscsm.panoram4.com\/ca\/services\/silk-pajamas\/\"\n           data-no-translation-href\n           class=\"service-card \"\n           style=\"\n                background-image:\n                linear-gradient(rgba(0,0,0,0.1), rgba(0,0,0,0.7)),\n                url(https:\/\/h000001.hotelscsm.panoram4.com\/wp-content\/uploads\/sites\/18\/2026\/05\/magnific_sophisticated-natural-pro_2966419531.jpeg);\n                text-decoration:none;\n           \">\n\n            <div class=\"service-card-info\">\n\n                <p class=\"service-price\">\n                    20\u20ac\n                <\/p>\n\n                <h3 class=\"service-title\">\n                    Silk pajamas\n                <\/h3>\n\n            <\/div>\n\n        <\/a>\n        <a href=\"https:\/\/h000001.hotelscsm.panoram4.com\/ca\/services\/solid-color-dress\/\"\n           data-no-translation-href\n           class=\"service-card \"\n           style=\"\n                background-image:\n                linear-gradient(rgba(0,0,0,0.1), rgba(0,0,0,0.7)),\n                url(https:\/\/h000001.hotelscsm.panoram4.com\/wp-content\/uploads\/sites\/18\/2026\/05\/magnific_sophisticated-and-natural_2966455608.jpeg);\n                text-decoration:none;\n           \">\n\n            <div class=\"service-card-info\">\n\n                <p class=\"service-price\">\n                    19\u20ac\n                <\/p>\n\n                <h3 class=\"service-title\">\n                    Solid-color dress\n                <\/h3>\n\n            <\/div>\n\n        <\/a>\n        <a href=\"https:\/\/h000001.hotelscsm.panoram4.com\/ca\/services\/suit-jacket-blazer-or-sports-jacket\/\"\n           data-no-translation-href\n           class=\"service-card \"\n           style=\"\n                background-image:\n                linear-gradient(rgba(0,0,0,0.1), rgba(0,0,0,0.7)),\n                url(https:\/\/h000001.hotelscsm.panoram4.com\/wp-content\/uploads\/sites\/18\/2026\/05\/magnific_sophisticated-red-sport-j_2966367226.jpeg);\n                text-decoration:none;\n           \">\n\n            <div class=\"service-card-info\">\n\n                <p class=\"service-price\">\n                    16.50\u20ac\n                <\/p>\n\n                <h3 class=\"service-title\">\n                    Suit jacket, blazer, or sports jacket\n                <\/h3>\n\n            <\/div>\n\n        <\/a>\n        <a href=\"https:\/\/h000001.hotelscsm.panoram4.com\/ca\/services\/sweaters-polo-shirts\/\"\n           data-no-translation-href\n           class=\"service-card \"\n           style=\"\n                background-image:\n                linear-gradient(rgba(0,0,0,0.1), rgba(0,0,0,0.7)),\n                url(https:\/\/h000001.hotelscsm.panoram4.com\/wp-content\/uploads\/sites\/18\/2026\/05\/magnific_sophisticated-green-sweat_2966378604.jpeg);\n                text-decoration:none;\n           \">\n\n            <div class=\"service-card-info\">\n\n                <p class=\"service-price\">\n                    10\u20ac\n                <\/p>\n\n                <h3 class=\"service-title\">\n                    Sweaters, polo shirts  \n                <\/h3>\n\n            <\/div>\n\n        <\/a>\n        <a href=\"https:\/\/h000001.hotelscsm.panoram4.com\/ca\/services\/tie\/\"\n           data-no-translation-href\n           class=\"service-card \"\n           style=\"\n                background-image:\n                linear-gradient(rgba(0,0,0,0.1), rgba(0,0,0,0.7)),\n                url(https:\/\/h000001.hotelscsm.panoram4.com\/wp-content\/uploads\/sites\/18\/2026\/05\/magnific_sophisticated-and-natural_2966250713.jpeg);\n                text-decoration:none;\n           \">\n\n            <div class=\"service-card-info\">\n\n                <p class=\"service-price\">\n                    5\u20ac\n                <\/p>\n\n                <h3 class=\"service-title\">\n                    Tie\n                <\/h3>\n\n            <\/div>\n\n        <\/a>\n        <a href=\"https:\/\/h000001.hotelscsm.panoram4.com\/ca\/services\/two-piece-suit\/\"\n           data-no-translation-href\n           class=\"service-card \"\n           style=\"\n                background-image:\n                linear-gradient(rgba(0,0,0,0.1), rgba(0,0,0,0.7)),\n                url(https:\/\/h000001.hotelscsm.panoram4.com\/wp-content\/uploads\/sites\/18\/2026\/05\/magnific_sophisticated-and-natural_2965454402.jpeg);\n                text-decoration:none;\n           \">\n\n            <div class=\"service-card-info\">\n\n                <p class=\"service-price\">\n                    25\u20ac\n                <\/p>\n\n                <h3 class=\"service-title\">\n                    Two-piece suit\n                <\/h3>\n\n            <\/div>\n\n        <\/a>\n        <a href=\"https:\/\/h000001.hotelscsm.panoram4.com\/ca\/services\/undershirt-casual-shirt\/\"\n           data-no-translation-href\n           class=\"service-card \"\n           style=\"\n                background-image:\n                linear-gradient(rgba(0,0,0,0.1), rgba(0,0,0,0.7)),\n                url(https:\/\/h000001.hotelscsm.panoram4.com\/wp-content\/uploads\/sites\/18\/2026\/05\/magnific_sophisticated-and-natural_2964808687.jpeg);\n                text-decoration:none;\n           \">\n\n            <div class=\"service-card-info\">\n\n                <p class=\"service-price\">\n                    7.50\u20ac\n                <\/p>\n\n                <h3 class=\"service-title\">\n                    Undershirt \/ casual shirt\n                <\/h3>\n\n            <\/div>\n\n        <\/a>\n        <a href=\"https:\/\/h000001.hotelscsm.panoram4.com\/ca\/services\/underwear\/\"\n           data-no-translation-href\n           class=\"service-card \"\n           style=\"\n                background-image:\n                linear-gradient(rgba(0,0,0,0.1), rgba(0,0,0,0.7)),\n                url(https:\/\/h000001.hotelscsm.panoram4.com\/wp-content\/uploads\/sites\/18\/2026\/05\/magnific_sophisticated-natural-pro_2966346935.jpeg);\n                text-decoration:none;\n           \">\n\n            <div class=\"service-card-info\">\n\n                <p class=\"service-price\">\n                    2.50\u20ac\n                <\/p>\n\n                <h3 class=\"service-title\">\n                    Underwear\n                <\/h3>\n\n            <\/div>\n\n        <\/a>\n        <a href=\"https:\/\/h000001.hotelscsm.panoram4.com\/ca\/services\/cufflinks\/\"\n           data-no-translation-href\n           class=\"service-card \"\n           style=\"\n                background-image:\n                linear-gradient(rgba(0,0,0,0.1), rgba(0,0,0,0.7)),\n                url(https:\/\/h000001.hotelscsm.panoram4.com\/wp-content\/uploads\/sites\/18\/2026\/05\/magnific_sophisticated-man-vest-on_2966436941.jpeg);\n                text-decoration:none;\n           \">\n\n            <div class=\"service-card-info\">\n\n                <p class=\"service-price\">\n                    9\u20ac\n                <\/p>\n\n                <h3 class=\"service-title\">\n                    Vest\n                <\/h3>\n\n            <\/div>\n\n        <\/a>\n        <\/div>\n    <\/div>\n    <button type=\"button\" class=\"kiosk-back-button\" onclick=\"window.history.back()\">\n        <span style=\"margin-inline: 7px; display: flex; align-items: center;\">\n            <img decoding=\"async\" style=\"width: 18px; height: 18px;\" class=\"arrow\" src=\"data:image\/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZlcnNpb249IjEuMSIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHdpZHRoPSI1MTIiIGhlaWdodD0iNTEyIiB4PSIwIiB5PSIwIiB2aWV3Qm94PSIwIDAgMjEuODI1IDIxLjgyNSIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgNTEyIDUxMiIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9IiI+PGcgdHJhbnNmb3JtPSJtYXRyaXgoNi4xMjMyMzM5OTU3MzY3NmUtMTcsMC45OTk5OTk5OTk5OTk5OTk5LC0wLjk5OTk5OTk5OTk5OTk5OTksNi4xMjMyMzM5OTU3MzY3NmUtMTcsMjEuODI1MjI2MDIxNzk5NiwtMC4wMDAyNjM0OTkyMjcwMDE0MTgwMykiPjxwYXRoIGQ9Ik0xNi43OTEgMTMuMjU0YTEuMTEyIDEuMTEyIDAgMCAxIDEuNTg3IDAgMS4xNCAxLjE0IDAgMCAxIDAgMS41ODdsLTYuNjUgNi42NTFhMS4xNCAxLjE0IDAgMCAxLS44MDkuMzMzYy0uMzE3IDAtLjYwMy0uMTI3LS44MS0uMzMzbC02LjY1LTYuNjUxYy0uNDQ0LS40NDQtLjQ0NC0xLjE0MyAwLTEuNTg3czEuMTQzLS40NDQgMS41ODcgMGw0Ljc0NiA0Ljc2MlYxLjExMUExLjExNiAxLjExNiAwIDAgMSAxMC45MTggMGMuNjE5IDAgMS4xMTEuNDkyIDEuMTExIDEuMTExdjE2LjkwNGw0Ljc2Mi00Ljc2MXoiIHN0eWxlPSIiIGZpbGw9IiNmZmZmZmYiIGRhdGEtb3JpZ2luYWw9IiMxZTIwMWQiIG9wYWNpdHk9IjEiIGNsYXNzPSIiPjwvcGF0aD48L2c+PC9zdmc+\" \/>    \n        <\/span> \n        <p style=\"margin: 0\">Back<\/p>\n    <\/button>\n        \n    <script>\n\n        document.addEventListener(\"DOMContentLoaded\", function() {\n\n            const filters = document.querySelectorAll(\".filter-btn\");\n            const cards   = document.querySelectorAll(\".service-card\");\n\n            filters.forEach(btn => {\n\n                btn.addEventListener(\"click\", function() {\n\n                    filters.forEach(b => b.classList.remove(\"active\"));\n\n                    this.classList.add(\"active\");\n\n                    const filterValue = this.getAttribute(\"data-filter\");\n\n                    cards.forEach(card => {\n\n                        if (\n                            filterValue === \"all\" ||\n                            card.classList.contains(filterValue)\n                        ) {\n                            card.style.display = \"flex\";\n                        } else {\n                            card.style.display = \"none\";\n                        }\n                    });\n                });\n            });\n\n            \/\/ Auto-scroll por zonas (igual que el TPV): puntero por ENCIMA del\n            \/\/ panel translucido => scroll arriba; por DEBAJO => scroll abajo.\n            \/\/ Velocidad proporcional a la distancia al borde.\n            (function() {\n                var scroller = document.querySelector(\".services-grid-scroll\");\n                if (!scroller) return;\n                var panel = scroller.closest(\".wp-block-kadence-column\") || scroller;\n                var mouseY = null, rafId = null;\n                function step() {\n                    rafId = null;\n                    if (mouseY === null) return;\n                    var r = panel.getBoundingClientRect(), v = 0;\n                    if (mouseY < r.top) { v = -Math.min(24, 6 + (r.top - mouseY) * 0.15); }\n                    else if (mouseY > r.bottom) { v = Math.min(24, 6 + (mouseY - r.bottom) * 0.15); }\n                    if (v !== 0) { scroller.scrollTop += v; rafId = requestAnimationFrame(step); }\n                }\n                document.addEventListener(\"mousemove\", function(e) { mouseY = e.clientY; if (rafId === null) rafId = requestAnimationFrame(step); });\n                document.addEventListener(\"mouseleave\", function() { mouseY = null; });\n            })();\n\n            (function() {\n\n                var selectedLevel = \"filter\";\n                var selectedFilterIndex = 0;\n                var selectedGridIndex = 0;\n                var keyboardOwnedByCart = false;\n\n                var filters = Array.prototype.slice.call(\n                    document.querySelectorAll(\".filter-btn\")\n                );\n\n                var grid = document.querySelector(\".services-grid-container\");\n                var gridScroll = document.querySelector(\".services-grid-scroll\");\n                var backButton = document.querySelector(\".kiosk-back-button\");\n                var servicesContainer = document.querySelector(\".services-main-container\");\n\n                if (!grid || !gridScroll || !backButton || !servicesContainer) {\n                    return;\n                }\n\n                \/*\n                * ------------------------------------------------------------\n                * ELEMENTOS VISIBLES DEL GRID\n                * ------------------------------------------------------------\n                *\/\n                function getVisibleCards() {\n\n                    return Array.prototype.slice.call(\n                        grid.querySelectorAll(\".service-card\")\n                    ).filter(function(card) {\n\n                        return window.getComputedStyle(card).display !== \"none\";\n\n                    });\n\n                }\n\n                \/*\n                * ------------------------------------------------------------\n                * DETERMINAR LAS FILAS DEL GRID\n                * ------------------------------------------------------------\n                *\n                * No asumimos 7\/4\/3\/2 columnas.\n                *\n                * Miramos offsetTop para detectar qu\u00e9 cards\n                * pertenecen a cada fila.\n                *\/\n                function getGridRows() {\n\n                    var cards = getVisibleCards();\n                    var rows = [];\n\n                    cards.forEach(function(card) {\n\n                        var top = card.offsetTop;\n\n                        var row = rows.find(function(existingRow) {\n                            return Math.abs(existingRow.top - top) < 5;\n                        });\n\n                        if (!row) {\n\n                            row = {\n                                top: top,\n                                cards: []\n                            };\n\n                            rows.push(row);\n                        }\n\n                        row.cards.push(card);\n                    });\n\n                    rows.sort(function(a, b) {\n                        return a.top - b.top;\n                    });\n\n                    \/*\n                    * Orden horizontal dentro de cada fila.\n                    *\/\n                    rows.forEach(function(row) {\n\n                        row.cards.sort(function(a, b) {\n                            return a.offsetLeft - b.offsetLeft;\n                        });\n\n                    });\n\n                    return rows;\n                }\n\n                \/*\n                * ------------------------------------------------------------\n                * SELECCI\u00d3N VISUAL\n                * ------------------------------------------------------------\n                *\/\n                function selectElement(element) {\n\n                    if (!element) {\n                        return;\n                    }\n\n                    keyboardOwnedByCart = false;\n\n                    \/*\n                    * La selecci\u00f3n visual la gestiona P4Keyboard.\n                    *\/\n                    if (\n                        window.P4Keyboard &&\n                        typeof window.P4Keyboard.setSelection === \"function\"\n                    ) {\n\n                        window.P4Keyboard.setSelection(element);\n\n                    } else {\n\n                        \/*\n                        * Fallback.\n                        *\/\n                        document.querySelectorAll(\n                            \".keyboard-selected, .kiosk-keyboard-selected\"\n                        ).forEach(function(el) {\n\n                            el.classList.remove(\"keyboard-selected\");\n                            el.classList.remove(\"kiosk-keyboard-selected\");\n\n                        });\n\n                        element.classList.add(\"keyboard-selected\");\n                    }\n\n                    \/*\n                    * Asegurar que el elemento sea visible en el scroll.\n                    *\/\n                    if (element.scrollIntoView) {\n\n                        try {\n\n                            element.scrollIntoView({\n                                block: \"nearest\",\n                                inline: \"nearest\"\n                            });\n\n                        } catch (err) {\n\n                            element.scrollIntoView(false);\n\n                        }\n                    }\n                }\n\n                \/*\n                * ------------------------------------------------------------\n                * FILTROS\n                * ------------------------------------------------------------\n                *\/\n                function selectFilter(index) {\n\n                    if (!filters.length) {\n                        return;\n                    }\n\n                    if (index < 0) {\n                        index = 0;\n                    }\n\n                    if (index >= filters.length) {\n                        index = filters.length - 1;\n                    }\n\n                    selectedFilterIndex = index;\n\n                    selectElement(filters[selectedFilterIndex]);\n                }\n\n                \/*\n                * ------------------------------------------------------------\n                * GRID\n                * ------------------------------------------------------------\n                *\/\n                function selectGridCard(index) {\n\n                    var cards = getVisibleCards();\n\n                    if (!cards.length) {\n                        return;\n                    }\n\n                    if (index < 0) {\n                        index = 0;\n                    }\n\n                    if (index >= cards.length) {\n                        index = cards.length - 1;\n                    }\n\n                    selectedGridIndex = index;\n\n                    selectElement(cards[selectedGridIndex]);\n                }\n\n                \/*\n                * ------------------------------------------------------------\n                * BACK\n                * ------------------------------------------------------------\n                *\/\n                function selectBack() {\n\n                    selectedLevel = \"back\";\n\n                    selectElement(backButton);\n                }\n\n                \/*\n                * ------------------------------------------------------------\n                * FOCO AL CARRITO\n                * ------------------------------------------------------------\n                *\/\n                function goToCart(){\n\n                    if(\n                        !window.P4CartKeyboard\n                    ){\n                        return;\n                    }\n\n                    \/*\n                    * Guardamos exactamente d\u00f3nde estaba la pantalla\n                    * antes de ceder el control al carrito.\n                    *\/\n                    var returnLevel = selectedLevel;\n                    var returnFilterIndex = selectedFilterIndex;\n                    var returnGridIndex = selectedGridIndex;\n\n                    if(\n                        window.P4CartKeyboard.select(function(){\n\n                            \/*\n                            * El carrito devuelve el control a esta pantalla.\n                            *\/\n                            keyboardOwnedByCart = false;\n\n                            \/*\n                            * Restauramos el mismo nivel y posici\u00f3n.\n                            *\/\n                            if(returnLevel === \"filter\"){\n\n                                selectedLevel = \"filter\";\n\n                                selectFilter(\n                                    returnFilterIndex\n                                );\n\n                                return;\n                            }\n\n                            if(returnLevel === \"grid\"){\n\n                                selectedLevel = \"grid\";\n\n                                selectGridCard(\n                                    returnGridIndex\n                                );\n\n                                return;\n                            }\n\n                            if(returnLevel === \"back\"){\n\n                                selectedLevel = \"back\";\n\n                                selectElement(\n                                    backButton\n                                );\n\n                                return;\n                            }\n\n                        })\n                    ){\n\n                        keyboardOwnedByCart = true;\n\n                        \/*\n                        * P4CartKeyboard.select() ya elimina\n                        * .keyboard-selected de la pantalla.\n                        *\/\n                    }\n                }\n\n\n                \/*\n                * ------------------------------------------------------------\n                * PRIMER ELEMENTO DE LA \u00daLTIMA FILA\n                * ------------------------------------------------------------\n                *\/\n                function getFirstCardOfLastRow() {\n\n                    var rows = getGridRows();\n\n                    if (!rows.length) {\n                        return null;\n                    }\n\n                    var lastRow = rows[rows.length - 1];\n\n                    if (!lastRow.cards.length) {\n                        return null;\n                    }\n\n                    return lastRow.cards[0];\n                }\n\n                \/*\n                * ------------------------------------------------------------\n                * BUSCAR INDEX DE UNA CARD\n                * ------------------------------------------------------------\n                *\/\n                function getCardIndex(card) {\n\n                    var cards = getVisibleCards();\n\n                    return cards.indexOf(card);\n                }\n\n                \/*\n                * =========================================================\n                * SINCRONIZAR P4Keyboard \u2192 ESTADO INTERNO\n                * =========================================================\n                *\n                * Cuando el rat\u00f3n cambia la selecci\u00f3n, actualizamos tambi\u00e9n\n                * selectedLevel y los \u00edndices de esta pantalla.\n                *\/\n                if (\n                    window.P4Keyboard &&\n                    typeof window.P4Keyboard.onSelectionChange === \"function\"\n                ) {\n\n                    window.P4Keyboard.onSelectionChange(function(element) {\n\n                        if (\n                            !element ||\n                            !servicesContainer.contains(element)\n                        ) {\n                            return;\n                        }\n\n                        keyboardOwnedByCart = false;\n\n                        \/*\n                        * -------------------------------------------------\n                        * FILTRO\n                        * -------------------------------------------------\n                        *\/\n                        var filterIndex = filters.indexOf(element);\n\n                        if (filterIndex >= 0) {\n\n                            selectedLevel = \"filter\";\n                            selectedFilterIndex = filterIndex;\n\n                            return;\n                        }\n\n                        \/*\n                        * -------------------------------------------------\n                        * BACK\n                        * -------------------------------------------------\n                        *\/\n                        if (\n                            backButton &&\n                            element === backButton\n                        ) {\n\n                            selectedLevel = \"back\";\n\n                            return;\n                        }\n\n                        \/*\n                        * -------------------------------------------------\n                        * SERVICE CARD\n                        * -------------------------------------------------\n                        *\/\n                        if (\n                            element.classList.contains(\"service-card\")\n                        ) {\n\n                            var cards = getVisibleCards();\n                            var cardIndex = cards.indexOf(element);\n\n                            if (cardIndex >= 0) {\n\n                                selectedLevel = \"grid\";\n                                selectedGridIndex = cardIndex;\n                            }\n                        }\n\n                    });\n                }\n\n                \/*\n                * ------------------------------------------------------------\n                * EJECUTAR ELEMENTO\n                * ------------------------------------------------------------\n                *\/\n                function activateElement(element) {\n\n                    if (!element) {\n                        return;\n                    }\n\n                    \/*\n                    * Filtro\n                    *\/\n                    if (element.classList.contains(\"filter-btn\")) {\n\n                        element.click();\n                        return;\n                    }\n\n                    \/*\n                    * Back\n                    *\/\n                    if (element.classList.contains(\"kiosk-back-button\")) {\n\n                        window.history.back();\n                        return;\n                    }\n\n                    \/*\n                    * Service\n                    *\/\n                    if (element.classList.contains(\"service-card\")) {\n\n                        var href = element.getAttribute(\"href\");\n\n                        if (href && href !== \"#\") {\n                            window.location.href = href;\n                        }\n\n                        return;\n                    }\n                }\n\n                \/*\n                * ------------------------------------------------------------\n                * SELECCI\u00d3N INICIAL\n                * ------------------------------------------------------------\n                *\/\n                selectedLevel = \"filter\";\n                selectedFilterIndex = 0;\n\n                if (filters.length) {\n                    selectFilter(0);\n                }\n\n                \/*\n                * ------------------------------------------------------------\n                * KEYBOARD\n                * ------------------------------------------------------------\n                *\/\n                \n                document.addEventListener(\"keydown\", function(e) {\n\n                    \/*\n                    * Solo kiosco \/ desktop.\n                    *\/\n                    if (window.innerWidth <= 768) {\n                        return;\n                    }\n\n                    if (keyboardOwnedByCart) {\n                        return;\n                    }\n\n                    if(window.P4CartKeyboardOpen){\n                        return;\n                    }\n\n                    \/*\n                    * ========================================================\n                    * ENTER\n                    * ========================================================\n                    *\/\n                    if (e.key === \"Enter\") {\n\n                        e.preventDefault();\n\n                        var selected = null;\n\n                        \/*\n                        * Primero usamos la selecci\u00f3n global.\n                        *\/\n                        if (\n                            window.P4Keyboard &&\n                            typeof window.P4Keyboard.getSelection === \"function\"\n                        ) {\n\n                            selected = window.P4Keyboard.getSelection();\n                        }\n\n                        \/*\n                        * Solo aceptamos elementos de esta pantalla.\n                        *\/\n                        if (\n                            !selected ||\n                            !servicesContainer.contains(selected)\n                        ) {\n\n                            selected = null;\n                        }\n\n                        \/*\n                        * Fallback al estado interno.\n                        *\/\n                        if (!selected) {\n\n                            if (selectedLevel === \"filter\") {\n\n                                selected = filters[selectedFilterIndex];\n\n                            } else if (selectedLevel === \"grid\") {\n\n                                var fallbackCards = getVisibleCards();\n\n                                selected = fallbackCards[selectedGridIndex];\n\n                            } else if (selectedLevel === \"back\") {\n\n                                selected = backButton;\n                            }\n                        }\n\n                        if (!selected) {\n                            return;\n                        }\n\n                        activateElement(selected);\n                        return;\n                    }\n\n                    \/*\n                    * ========================================================\n                    * FILTERS\n                    * ========================================================\n                    *\/\n                    if (selectedLevel === \"filter\") {\n\n                        \/*\n                        * \u2190\n                        *\/\n                        if (e.key === \"ArrowLeft\") {\n\n                            e.preventDefault();\n\n                            if (selectedFilterIndex > 0) {\n                                selectedFilterIndex--;\n                                selectFilter(selectedFilterIndex);\n                            }\n\n                            return;\n                        }\n\n                        \/*\n                        * \u2192\n                        *\/\n                        if (e.key === \"ArrowRight\") {\n\n                            e.preventDefault();\n\n                            if (selectedFilterIndex < filters.length - 1) {\n                                selectedFilterIndex++;\n                                selectFilter(selectedFilterIndex);\n                            }\n\n                            return;\n                        }\n\n                        \/*\n                        * \u2193\n                        *\n                        * Entrar al primer elemento del grid.\n                        *\/\n                        if (e.key === \"ArrowDown\") {\n\n                            e.preventDefault();\n\n                            var cards = getVisibleCards();\n\n                            if (cards.length) {\n\n                                selectedLevel = \"grid\";\n\n                                selectedGridIndex = 0;\n\n                                selectGridCard(0);\n                            }\n\n                            return;\n                        }\n\n                        \/*\n                        * \u2191\n                        *\n                        * Va al carrito\n                        *\/\n                        if (e.key === \"ArrowUp\") {\n\n                            e.preventDefault();\n                            goToCart();\n                            return;\n                        }\n\n                        return;\n                    }\n\n                    \/*\n                    * ========================================================\n                    * GRID\n                    * ========================================================\n                    *\/\n                    if (selectedLevel === \"grid\") {\n\n                        var visibleCards = getVisibleCards();\n\n                        if (!visibleCards.length) {\n                            return;\n                        }\n\n                        var currentCard = visibleCards[selectedGridIndex];\n\n                        if (!currentCard) {\n                            selectedGridIndex = 0;\n                            currentCard = visibleCards[0];\n                        }\n\n                        var rows = getGridRows();\n\n                        \/*\n                        * Encontrar fila y columna actual.\n                        *\/\n                        var currentRowIndex = -1;\n                        var currentColIndex = -1;\n\n                        rows.forEach(function(row, rowIndex) {\n\n                            var indexInRow = row.cards.indexOf(currentCard);\n\n                            if (indexInRow !== -1) {\n                                currentRowIndex = rowIndex;\n                                currentColIndex = indexInRow;\n                            }\n\n                        });\n\n                        \/*\n                        * \u2190\n                        *\/\n                        if (e.key === \"ArrowLeft\") {\n\n                            e.preventDefault();\n\n                            \/*\n                            * Solo nos movemos si existe elemento a la izquierda.\n                            *\/\n                            if (currentColIndex > 0) {\n\n                                var previousCard =\n                                    rows[currentRowIndex].cards[currentColIndex - 1];\n\n                                selectedGridIndex = getCardIndex(previousCard);\n\n                                selectElement(previousCard);\n                            }\n\n                            return;\n                        }\n\n                        \/*\n                        * \u2192\n                        *\/\n                        if (e.key === \"ArrowRight\") {\n\n                            e.preventDefault();\n\n                            \/*\n                            * Si existe a la derecha, vamos a \u00e9l.\n                            *\/\n                            if (\n                                currentColIndex <\n                                rows[currentRowIndex].cards.length - 1\n                            ) {\n\n                                var nextCard =\n                                    rows[currentRowIndex].cards[currentColIndex + 1];\n\n                                selectedGridIndex = getCardIndex(nextCard);\n\n                                selectElement(nextCard);\n                            }\n\n                            return;\n                        }\n\n                        \/*\n                        * \u2191\n                        *\/\n                        if (e.key === \"ArrowUp\") {\n\n                            e.preventDefault();\n\n                            \/*\n                            * Primera fila:\n                            * volvemos a los filtros.\n                            *\/\n                            if (currentRowIndex === 0) {\n\n                                selectedLevel = \"filter\";\n\n                                selectFilter(selectedFilterIndex);\n\n                                return;\n                            }\n\n                            \/*\n                            * Fila anterior.\n                            *\n                            * Intentamos conservar la misma columna.\n                            * Si la fila anterior tiene menos elementos,\n                            * usamos el \u00faltimo disponible.\n                            *\/\n                            var previousRow = rows[currentRowIndex - 1];\n\n                            var targetCol = Math.min(\n                                currentColIndex,\n                                previousRow.cards.length - 1\n                            );\n\n                            var upperCard = previousRow.cards[targetCol];\n\n                            selectedGridIndex = getCardIndex(upperCard);\n\n                            selectElement(upperCard);\n\n                            return;\n                        }\n\n                        \/*\n                        * \u2193\n                        *\/\n                        if (e.key === \"ArrowDown\") {\n\n                            e.preventDefault();\n\n                            \/*\n                            * \u00daltima fila:\n                            * Back.\n                            *\/\n                            if (currentRowIndex === rows.length - 1) {\n\n                                selectBack();\n\n                                return;\n                            }\n\n                            \/*\n                            * Fila siguiente.\n                            *\n                            * Intentamos mantener la misma columna.\n                            *\/\n                            var nextRow = rows[currentRowIndex + 1];\n\n                            var targetNextCol = Math.min(\n                                currentColIndex,\n                                nextRow.cards.length - 1\n                            );\n\n                            var lowerCard = nextRow.cards[targetNextCol];\n\n                            selectedGridIndex = getCardIndex(lowerCard);\n\n                            selectElement(lowerCard);\n\n                            return;\n                        }\n\n                        return;\n                    }\n\n                    \/*\n                    * ========================================================\n                    * BACK\n                    * ========================================================\n                    *\/\n                    if (selectedLevel === \"back\") {\n\n                        \/*\n                        * \u2190\n                        * No hace nada.\n                        *\/\n                        if (e.key === \"ArrowLeft\") {\n\n                            e.preventDefault();\n                            return;\n                        }\n\n                        \/*\n                        * \u2192\n                        * No hace nada.\n                        *\/\n                        if (e.key === \"ArrowRight\") {\n\n                            e.preventDefault();\n                            return;\n                        }\n\n                        \/*\n                        * \u2193\n                        * No hace nada.\n                        *\/\n                        if (e.key === \"ArrowDown\") {\n\n                            e.preventDefault();\n                            return;\n                        }\n\n                        \/*\n                        * \u2191\n                        *\n                        * Primer elemento de la \u00faltima fila.\n                        *\/\n                        if (e.key === \"ArrowUp\") {\n\n                            e.preventDefault();\n\n                            var lastCard = getFirstCardOfLastRow();\n\n                            if (lastCard) {\n\n                                selectedLevel = \"grid\";\n\n                                selectedGridIndex = getCardIndex(lastCard);\n\n                                selectElement(lastCard);\n                            }\n\n                            return;\n                        }\n\n                        return;\n                    }\n\n                });\n\n            })();\n\n        });\n\n    <\/script>\n    <\/div>\n<\/div><\/div>\n\n\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":{"_acf_changed":false,"_kad_post_transparent":"","_kad_post_title":"","_kad_post_layout":"","_kad_post_sidebar_id":"","_kad_post_content_style":"","_kad_post_vertical_padding":"","_kad_post_feature":"","_kad_post_feature_position":"","_kad_post_header":false,"_kad_post_footer":false,"_kad_post_classname":"","footnotes":""},"class_list":["post-14","page","type-page","status-publish","hentry"],"acf":[],"_links":{"self":[{"href":"https:\/\/h000001.hotelscsm.panoram4.com\/ca\/wp-json\/wp\/v2\/pages\/14","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/h000001.hotelscsm.panoram4.com\/ca\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/h000001.hotelscsm.panoram4.com\/ca\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/h000001.hotelscsm.panoram4.com\/ca\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/h000001.hotelscsm.panoram4.com\/ca\/wp-json\/wp\/v2\/comments?post=14"}],"version-history":[{"count":4,"href":"https:\/\/h000001.hotelscsm.panoram4.com\/ca\/wp-json\/wp\/v2\/pages\/14\/revisions"}],"predecessor-version":[{"id":1137,"href":"https:\/\/h000001.hotelscsm.panoram4.com\/ca\/wp-json\/wp\/v2\/pages\/14\/revisions\/1137"}],"wp:attachment":[{"href":"https:\/\/h000001.hotelscsm.panoram4.com\/ca\/wp-json\/wp\/v2\/media?parent=14"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}