{"id":8258,"date":"2023-04-07T16:31:52","date_gmt":"2023-04-07T14:31:52","guid":{"rendered":"https:\/\/pinacotecabologna.cultura.gov.it\/?page_id=8258"},"modified":"2024-09-23T11:48:24","modified_gmt":"2024-09-23T09:48:24","slug":"palazzo-pepoli-campogrande-html","status":"publish","type":"page","link":"https:\/\/pinacotecabologna.cultura.gov.it\/en\/palazzo-pepoli-campogrande-html","title":{"rendered":"Palazzo Pepoli Campogrande \u2013 The Zambeccari Collection"},"content":{"rendered":"<div class=\"tipo-di-testo   pt-[20px] \">\r\n\r\n\t\r\n\t<div class=\"testo-pnb-wrap \">\r\n\t\t<p>Palazzo Pepoli Campogrande ospita una selezione di opere collezionate dagli Zambeccari, importante famiglia bolognese entrata a far parte, gi\u00e0 dalla met\u00e0 del Quattrocento, della ristretta oligarchia che deteneva il potere cittadino.<br \/>La quadreria accrebbe in modo particolare nel corso del Settecento grazie alle cure dei marchesi Camillo (1656 \u20131731), Francesco (1682 \u2013 1767) e Giacomo (1723 \u2013 1795). Quest\u2019ultimo la allest\u00ec nel palazzo di via de\u2019 Carbonesi ed espresse nel testamento la volont\u00e0 di donare la raccolta, una volta estinto l\u2019asse ereditario della propria famiglia, all\u2019Istituto delle Scienze. Tuttavia, le opere entrarono a far parte del patrimonio dell\u2019allora Regia Pinacoteca di Bologna soltanto nel 1884, al termine di complesse vicende giudiziarie.<br \/>Diversamente dalla gran parte delle quadrerie nobiliari cittadine, colpite da profonde dispersioni nel corso dei secoli, la collezione Zambeccari ha conservato quasi integra l\u2019identit\u00e0 conferita fin dall\u2019origine ed \u00e8 pertanto evocativa dell\u2019arredo di un palazzo dell\u2019aristocrazia bolognese settecentesca.<br \/>Come tipico delle raccolte private, oltre ad opere di soggetto religioso, include numerosi dipinti di genere, ritratti e nature morte. Tra gli artisti presenti all\u2019interno della collezione vi sono Bartolomeo Passerotti, Denijs Calvaert, Ludovico Carracci, Elisabetta Sirani, Mattia Preti, Lorenzo Pasinelli, Francesco Solimena, Luca Giordano, Sebastiano Ricci.<\/p>\n\t<\/div>\r\n\r\n\t<\/div>\r\n\n\n<div class=\"shortcode  pt-[20px] \">\r\n\r\n\t\r\n\t\t<div class=\"pnb-map-shell\">\n    <div class=\"pnb-map-stage\">\n        <div class=\"svg-map pnb-interactive-map\" style=\"display:block; width:100%; margin-left:auto; margin-right:auto\">\n            <svg width=\"100%\" height=\"100%\" viewBox=\"0 0 3723 1807\" version=\"1.1\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" xmlns:xlink=\"http:\/\/www.w3.org\/1999\/xlink\" xml:space=\"preserve\" xmlns:serif=\"http:\/\/www.serif.com\/\" style=\"fill-rule:evenodd;clip-rule:evenodd;stroke-miterlimit:10;\"><g id=\"_5\" serif:id=\"5\"><path d=\"M1379.38,1037.62l-463.208,50.4l-346,-370.283l463.212,-50.4l345.996,370.283Z\" style=\"fill:#e38aa9;fill-rule:nonzero;\"\/><text x=\"708.755px\" y=\"608.996px\" style=\"font-family:'LucidaGrande', 'Lucida Grande', sans-serif;font-weight:500;font-size:100px;fill:#1e1e1c;\">5<\/text><path d=\"M974.783,871.117l-4.013,-4.334\" style=\"fill:none;fill-rule:nonzero;stroke:#010303;stroke-width:4.17px;\"\/><path d=\"M962.792,858.161l-187.559,-202.658\" style=\"fill:none;fill-rule:nonzero;stroke:#010303;stroke-width:4.17px;stroke-dasharray:11.75,11.75;\"\/><path d=\"M771.247,651.195l-4.012,-4.337\" style=\"fill:none;fill-rule:nonzero;stroke:#010303;stroke-width:4.17px;\"\/><\/g><g id=\"_4\" serif:id=\"4\"><path d=\"M1295.48,1123.53l-65.117,-69.688l-130.858,14.238l65.117,69.687l-259.021,28.184l319.954,342.404l463.213,-50.396l-319.955,-342.408l-73.333,7.979Z\" style=\"fill:#ffc69a;fill-rule:nonzero;\"\/><text x=\"1528.15px\" y=\"1630.58px\" style=\"font-family:'LucidaGrande', 'Lucida Grande', sans-serif;font-weight:500;font-size:100px;fill:#1e1e1c;\">4<\/text><path d=\"M1508.11,1531.4l-4.012,-4.333\" style=\"fill:none;fill-rule:nonzero;stroke:#010303;stroke-width:4.17px;\"\/><path d=\"M1496.12,1518.44l-187.558,-202.654\" style=\"fill:none;fill-rule:nonzero;stroke:#010303;stroke-width:4.17px;stroke-dasharray:11.75,11.75;\"\/><path d=\"M1304.57,1311.48l-4.012,-4.334\" style=\"fill:none;fill-rule:nonzero;stroke:#010303;stroke-width:4.17px;\"\/><\/g><g id=\"_3\" serif:id=\"3\"><path d=\"M2069.32,1416.55l-380.555,41.408l-319.954,-342.408l380.559,-41.409l319.95,342.409Z\" style=\"fill:#94bad7;fill-rule:nonzero;\"\/><text x=\"1950.42px\" y=\"1585.32px\" style=\"font-family:'LucidaGrande', 'Lucida Grande', sans-serif;font-weight:500;font-size:100px;fill:#1e1e1c;\">3<\/text><path d=\"M1930.38,1486.14l-4.013,-4.338\" style=\"fill:none;fill-rule:nonzero;stroke:#010303;stroke-width:4.17px;\"\/><path d=\"M1918.39,1473.18l-187.559,-202.654\" style=\"fill:none;fill-rule:nonzero;stroke:#010303;stroke-width:4.17px;stroke-dasharray:11.75,11.75;\"\/><path d=\"M1726.84,1266.21l-4.012,-4.334\" style=\"fill:none;fill-rule:nonzero;stroke:#010303;stroke-width:4.17px;\"\/><\/g><g id=\"_2\" serif:id=\"2\"><path d=\"M2597.02,1359.13l-527.7,57.416l-319.954,-342.404l527.704,-57.421l319.95,342.409Z\" style=\"fill:#b8c581;fill-rule:nonzero;\"\/><text x=\"2420.69px\" y=\"1535.7px\" style=\"font-family:'LucidaGrande', 'Lucida Grande', sans-serif;font-weight:500;font-size:100px;fill:#1e1e1c;\">2<\/text><path d=\"M2400.65,1436.52l-4.013,-4.333\" style=\"fill:none;fill-rule:nonzero;stroke:#010303;stroke-width:4.17px;\"\/><path d=\"M2388.65,1423.56l-187.558,-202.655\" style=\"fill:none;fill-rule:nonzero;stroke:#010303;stroke-width:4.17px;stroke-dasharray:11.75,11.75;\"\/><path d=\"M2197.11,1216.6l-4.013,-4.333\" style=\"fill:none;fill-rule:nonzero;stroke:#010303;stroke-width:4.17px;\"\/><\/g><g id=\"_1\" serif:id=\"1\"><path d=\"M3256.79,1287.34l-659.767,71.788l-731.066,-782.379l659.766,-71.788l731.067,782.379Z\" style=\"fill:#ffa196;fill-rule:nonzero;\"\/><text x=\"3017.87px\" y=\"850.297px\" style=\"font-family:'LucidaGrande', 'Lucida Grande', sans-serif;font-weight:500;font-size:100px;fill:#1e1e1c;\">1<\/text><path d=\"M2973.1,852.456l-5.871,0.634\" style=\"fill:none;fill-rule:nonzero;stroke:#010303;stroke-width:4.17px;\"\/><path d=\"M2955.66,854.344l-387.83,41.967\" style=\"fill:none;fill-rule:nonzero;stroke:#010303;stroke-width:4.17px;stroke-dasharray:11.65,11.65;\"\/><path d=\"M2562.03,896.939l-5.871,0.633\" style=\"fill:none;fill-rule:nonzero;stroke:#010303;stroke-width:4.17px;\"\/><\/g><g id=\"Ingressso\"><path d=\"M1035.66,670.01l122.433,131.025l217.979,-23.717l288.683,308.942l614.588,-66.867l-411.117,-439.97l-832.566,90.587Z\" style=\"fill:#cbcbc6;fill-rule:nonzero;\"\/><g transform=\"matrix(4.16667,0,0,4.16667,-794,-542)\"><text x=\"488.277px\" y=\"222.012px\" style=\"font-family:'LucidaGrande', 'Lucida Grande', sans-serif;font-weight:500;font-size:24px;fill:#1e1e1c;\">I<tspan x=\"496.406px 515.352px 533.912px 550.303px 564.526px 578.668px 592.809px \" y=\"222.012px 222.012px 222.012px 222.012px 222.012px 222.012px 222.012px \">NGRESSO<\/tspan><\/text><text x=\"488.277px\" y=\"250.812px\" style=\"font-family:'LucidaGrande', 'Lucida Grande', sans-serif;font-weight:500;font-size:24px;fill:#1e1e1c;\">E<tspan x=\"501.703px 519.852px 535.446px 551.04px 568.016px 586.165px 603.189px \" y=\"250.812px 250.812px 250.812px 250.812px 250.812px 250.812px 250.812px \">NTRANCE<\/tspan><\/text><\/g><path d=\"M1497.59,536.545l123.7,133.662l260.383,-26.854\" style=\"fill:none;fill-rule:nonzero;stroke:#010303;stroke-width:11.81px;\"\/><path d=\"M1853.43,624.985l33.562,37.291l49.017,-24.446l-82.579,-12.845Z\" style=\"fill:#010303;fill-rule:nonzero;\"\/><\/g><g id=\"Mappa-Outline\" serif:id=\"Mappa Outline\"><path d=\"M1421.42,812.462l199.912,-21.754\" style=\"fill:none;fill-rule:nonzero;stroke:#1d1d1b;stroke-width:8.33px;\"\/><path d=\"M1444.57,837.238l199.912,-21.754\" style=\"fill:none;fill-rule:nonzero;stroke:#1d1d1b;stroke-width:8.33px;\"\/><path d=\"M1467.72,862.015l199.909,-21.75\" style=\"fill:none;fill-rule:nonzero;stroke:#1d1d1b;stroke-width:8.33px;\"\/><path d=\"M1490.88,886.79l199.908,-21.75\" style=\"fill:none;fill-rule:nonzero;stroke:#1d1d1b;stroke-width:8.33px;\"\/><path d=\"M1514.03,911.571l199.908,-21.754\" style=\"fill:none;fill-rule:nonzero;stroke:#1d1d1b;stroke-width:8.33px;\"\/><path d=\"M1812.9,769.863l199.909,-21.75\" style=\"fill:none;fill-rule:nonzero;stroke:#1d1d1b;stroke-width:8.33px;\"\/><path d=\"M1836.06,794.64l199.909,-21.75\" style=\"fill:none;fill-rule:nonzero;stroke:#1d1d1b;stroke-width:8.33px;\"\/><path d=\"M1859.21,819.42l199.908,-21.754\" style=\"fill:none;fill-rule:nonzero;stroke:#1d1d1b;stroke-width:8.33px;\"\/><path d=\"M1882.36,844.196l199.908,-21.754\" style=\"fill:none;fill-rule:nonzero;stroke:#1d1d1b;stroke-width:8.33px;\"\/><path d=\"M1905.52,868.973l199.909,-21.75\" style=\"fill:none;fill-rule:nonzero;stroke:#1d1d1b;stroke-width:8.33px;\"\/><path d=\"M1890.77,1047.15l-138.917,-148.662\" style=\"fill:none;fill-rule:nonzero;stroke:#1d1d1b;stroke-width:8.33px;\"\/><path d=\"M1924.09,1043.53l-138.912,-148.666\" style=\"fill:none;fill-rule:nonzero;stroke:#1d1d1b;stroke-width:8.33px;\"\/><path d=\"M1957.41,1039.9l-138.917,-148.666\" style=\"fill:none;fill-rule:nonzero;stroke:#1d1d1b;stroke-width:8.33px;\"\/><path d=\"M1990.73,1036.28l-138.917,-148.667\" style=\"fill:none;fill-rule:nonzero;stroke:#1d1d1b;stroke-width:8.33px;\"\/><path d=\"M2024.05,1032.65l-138.917,-148.667\" style=\"fill:none;fill-rule:nonzero;stroke:#1d1d1b;stroke-width:8.33px;\"\/><path d=\"M916.177,1088.02l-346,-370.279l463.213,-50.405l1492.33,-162.375l731.067,782.38l-2031.23,221.008l-319.95,-342.408l260.554,-28.35l-62.854,-68.663l-187.129,19.092Z\" style=\"fill:none;fill-rule:nonzero;stroke:#1d1d1b;stroke-width:8.33px;\"\/><path d=\"M1063.52,699.588l-30.125,-32.246\" style=\"fill:none;fill-rule:nonzero;stroke:#1d1d1b;stroke-width:8.33px;\"\/><path d=\"M1865.96,576.753l30.129,32.245\" style=\"fill:none;fill-rule:nonzero;stroke:#1d1d1b;stroke-width:4.17px;\"\/><path d=\"M1688.77,1457.95l-40.054,-42.863\" style=\"fill:none;fill-rule:nonzero;stroke:#1d1d1b;stroke-width:8.33px;\"\/><path d=\"M1155.82,798.367l217.979,-23.717l288.687,308.942l614.588,-66.871l217.721,233.004\" style=\"fill:none;fill-rule:nonzero;stroke:#1d1d1b;stroke-width:8.33px;\"\/><path d=\"M1586.54,1348.55l-217.725,-233.004l-73.333,7.979l-65.113,-69.683l149.017,-16.217l-253.696,-271.5\" style=\"fill:none;fill-rule:nonzero;stroke:#1d1d1b;stroke-width:8.33px;\"\/><path d=\"M1368.81,1115.55l293.671,-31.954\" style=\"fill:none;fill-rule:nonzero;stroke:#1d1d1b;stroke-width:8.33px;\"\/><path d=\"M1749.37,1074.14l217.725,233.004\" style=\"fill:none;fill-rule:nonzero;stroke:#1d1d1b;stroke-width:8.33px;\"\/><path d=\"M2069.32,1416.55l-40.05,-42.863\" style=\"fill:none;fill-rule:nonzero;stroke:#1d1d1b;stroke-width:8.33px;\"\/><path d=\"M2597.02,1359.13l-40.05,-42.863\" style=\"fill:none;fill-rule:nonzero;stroke:#1d1d1b;stroke-width:8.33px;\"\/><path d=\"M2277.07,1016.72l-318.813,-341.188\" style=\"fill:none;fill-rule:nonzero;stroke:#1d1d1b;stroke-width:8.33px;\"\/><\/g><\/svg>        <\/div>\n        <div class=\"pnb-map-controls\" aria-label=\"Controlli mappa\">\n            <button type=\"button\" class=\"pnb-map-control pnb-map-zoom-out\" aria-label=\"Riduci zoom mappa\">&#8211;<\/button>\n            <button type=\"button\" class=\"pnb-map-control pnb-map-zoom-reset\" aria-label=\"Adatta mappa alla vista\">1:1<\/button>\n            <button type=\"button\" class=\"pnb-map-control pnb-map-zoom-in\" aria-label=\"Aumenta zoom mappa\">+<\/button>\n        <\/div>\n    <\/div>\n    <aside class=\"pnb-map-panel\" aria-live=\"polite\">\n        <p class=\"pnb-map-panel-eyebrow\">Mappa del museo<\/p>\n        <h3 class=\"pnb-map-panel-title\">Seleziona una sala<\/h3>\n        <p class=\"pnb-map-panel-meta\">Passa sulla mappa o sull&#8217;elenco per vedere i dettagli.<\/p>\n        <p class=\"pnb-map-panel-description\">Le aree evidenziate sono collegate alle schede delle sale e delle collezioni.<\/p>\n        <a class=\"pnb-map-panel-cta hidden\" href=\"#\">Vai alla sala<\/a>\n    <\/aside>\n<\/div>\n\n<script>\n    (function () {\n        window.__pnbMapScriptLoaded = true;\n\n        const ready = function (callback) {\n            if (document.readyState === \"loading\") {\n                document.addEventListener(\"DOMContentLoaded\", callback);\n                return;\n            }\n\n            callback();\n        }\n\n        const normalizeRoomId = function (target) {\n            return target ? target.toString().replace(\/_\/g, \"\") : \"\";\n        }\n\n        const getAllHallLinks = function () {\n            return Array.prototype.slice.call(document.querySelectorAll(\"a[data-hall]\"));\n        }\n\n        const getHallLinks = function (target) {\n            const roomId = normalizeRoomId(target);\n            if (!roomId) return [];\n\n            return getAllHallLinks().filter(function (link) {\n                return normalizeRoomId(link.getAttribute(\"data-hall\")) === roomId;\n            });\n        }\n\n        const getFirstHallLink = function (target) {\n            return getHallLinks(target)[0] || null;\n        }\n\n        const initMapShell = function (shell) {\n            const map = shell.querySelector(\".pnb-interactive-map\");\n            const stage = shell.querySelector(\".pnb-map-stage\");\n            const panel = shell.querySelector(\".pnb-map-panel\");\n            if (!map || !stage || !panel) return;\n\n            const panelTitle = panel.querySelector(\".pnb-map-panel-title\");\n            const panelMeta = panel.querySelector(\".pnb-map-panel-meta\");\n            const panelDescription = panel.querySelector(\".pnb-map-panel-description\");\n            const panelCta = panel.querySelector(\".pnb-map-panel-cta\");\n            const ignoredIds = [\"Mappa-Outline\", \"Ingressso\", \"Ingresso\"];\n            let currentZoom = 1;\n            let panX = 0;\n            let panY = 0;\n            let isPanning = false;\n            let didPan = false;\n            let suppressMapClick = false;\n            let selectedRoomId = \"\";\n            let panStart = {\n                x: 0,\n                y: 0,\n                panX: 0,\n                panY: 0\n            };\n\n            const rooms = function () {\n                return Array.prototype.slice.call(map.querySelectorAll(\".pnb-map-room\"));\n            }\n\n            const getRoom = function (roomId) {\n                const normalizedRoomId = normalizeRoomId(roomId);\n                if (!normalizedRoomId) return null;\n\n                return Array.prototype.slice.call(map.querySelectorAll(\"g\")).filter(function (room) {\n                    return normalizeRoomId(room.getAttribute(\"id\")) === normalizedRoomId;\n                })[0] || null;\n            }\n\n            const getEventRoom = function (target, event) {\n                const directRoom = target ? (target.closest ? target.closest(\".pnb-map-room\") : null) : null;\n                if (directRoom) return directRoom;\n                if (!event) return null;\n\n                if (document.elementsFromPoint) {\n                    const pointedRoom = document.elementsFromPoint(event.clientX, event.clientY).map(function (element) {\n                        return element.closest ? element.closest(\".pnb-map-room\") : null;\n                    }).filter(Boolean)[0];\n\n                    if (pointedRoom) return pointedRoom;\n                }\n\n                let matchedRoom = null;\n                let matchedArea = Infinity;\n\n                rooms().forEach(function (room) {\n                    const rect = room.getBoundingClientRect();\n                    let containsPoint = event.clientX >= rect.left;\n                    containsPoint = containsPoint ? event.clientX <= rect.right : false;\n                    containsPoint = containsPoint ? event.clientY >= rect.top : false;\n                    containsPoint = containsPoint ? event.clientY <= rect.bottom : false;\n\n                    if (!containsPoint) return;\n\n                    const area = rect.width * rect.height;\n                    if (area < matchedArea) {\n                        matchedRoom = room;\n                        matchedArea = area;\n                    }\n                });\n\n                return matchedRoom;\n            }\n\n            const getGroupTitle = function (link) {\n                const item = link.closest(\".custom-accordion-item\");\n                const accordionId = item ? item.getAttribute(\"data-accordion\") : \"\";\n                if (!accordionId) return \"\";\n\n                const title = document.querySelector('.custom-map-accordions .custom-accordion[data-accordion=\"' + accordionId + '\"] .custom-accordion-title');\n                return title ? title.textContent.trim() : \"\";\n            }\n\n            const getRoomData = function (link, roomId) {\n                const roomTitle = link.querySelector(\".room-title\");\n                const roomNumber = link.querySelector(\".room-number\");\n                const title = roomTitle ? roomTitle.textContent.trim() : link.textContent.trim();\n                const number = roomNumber ? roomNumber.textContent.trim() : roomId;\n                const groupTitle = getGroupTitle(link);\n\n                return {\n                    title: title || \"Sala \" + number,\n                    number: number,\n                    groupTitle: groupTitle,\n                    href: link.getAttribute(\"href\") || \"#\"\n                };\n            }\n\n            const updateRoomPanel = function (link, roomId) {\n                const data = getRoomData(link, roomId);\n                panelTitle.textContent = data.title;\n                panelMeta.textContent = data.number ? \"Sala \" + data.number : \"Sala\";\n                panelDescription.textContent = data.groupTitle ? \"Area: \" + data.groupTitle : \"Consulta il percorso e le opere collegate a questa sala.\";\n                panelCta.setAttribute(\"href\", data.href);\n                panelCta.classList.remove(\"hidden\");\n            }\n\n            const updateGroupPanel = function (groupTitle, hallIds) {\n                const count = hallIds.length;\n                panelTitle.textContent = groupTitle || \"Area selezionata\";\n                panelMeta.textContent = count === 1 ? \"1 sala evidenziata\" : count + \" sale evidenziate\";\n                panelDescription.textContent = \"Le sale dell'area sono evidenziate sulla mappa. Seleziona una sala per aprire la relativa scheda.\";\n                panelCta.classList.add(\"hidden\");\n            }\n\n            const highlightLinkedItems = function (roomId) {\n                getAllHallLinks().forEach(function (link) {\n                    link.classList.remove(\"pnb-map-linked-active\");\n                });\n\n                getHallLinks(roomId).forEach(function (link) {\n                    link.classList.add(\"pnb-map-linked-active\");\n                });\n            }\n\n            const activateRoom = function (room, updatePanel) {\n                if (!room) return;\n\n                const roomId = normalizeRoomId(room.getAttribute(\"id\"));\n                const link = getFirstHallLink(roomId);\n                if (!link) return;\n\n                rooms().forEach(function (mapRoom) {\n                    mapRoom.classList.remove(\"is-active\");\n                });\n\n                room.classList.add(\"is-active\");\n                highlightLinkedItems(roomId);\n\n                if (updatePanel) {\n                    updateRoomPanel(link, roomId);\n                }\n            }\n\n            const selectRoom = function (room) {\n                if (!room) return;\n\n                selectedRoomId = normalizeRoomId(room.getAttribute(\"id\"));\n                rooms().forEach(function (mapRoom) {\n                    mapRoom.classList.remove(\"is-selected\");\n                });\n\n                room.classList.add(\"is-selected\");\n                activateRoom(room, true);\n            }\n\n            const clearHoverState = function () {\n                rooms().forEach(function (room) {\n                    room.classList.remove(\"is-active\");\n                    room.classList.remove(\"is-list-hovered\");\n                });\n\n                getAllHallLinks().forEach(function (link) {\n                    link.classList.remove(\"pnb-map-linked-active\");\n                });\n\n                if (selectedRoomId) {\n                    const selectedRoom = getRoom(selectedRoomId);\n                    if (selectedRoom) {\n                        selectedRoom.classList.add(\"is-selected\");\n                        highlightLinkedItems(selectedRoomId);\n                    }\n                }\n            }\n\n            const clampPan = function () {\n                if (currentZoom <= 1) {\n                    panX = 0;\n                    panY = 0;\n                    return;\n                }\n\n                const maxX = Math.max(0, (map.offsetWidth * (currentZoom - 1)) \/ 2);\n                const maxY = Math.max(0, (map.offsetHeight * (currentZoom - 1)) \/ 2);\n                panX = Math.max(-maxX, Math.min(maxX, panX));\n                panY = Math.max(-maxY, Math.min(maxY, panY));\n            }\n\n            const applyMapTransform = function () {\n                clampPan();\n                map.style.transform = \"translate(\" + panX + \"px, \" + panY + \"px) scale(\" + currentZoom + \")\";\n                shell.classList.toggle(\"is-map-zoomed\", currentZoom > 1);\n            }\n\n            const setZoom = function (zoom) {\n                currentZoom = Math.max(1, Math.min(1.8, zoom));\n                applyMapTransform();\n            }\n\n            Array.prototype.slice.call(map.querySelectorAll(\"g\")).forEach(function (room) {\n                const id = room.getAttribute(\"id\");\n                const link = getFirstHallLink(id);\n                if (!id || ignoredIds.indexOf(id) !== -1 || !link) return;\n\n                const roomId = normalizeRoomId(id);\n                const data = getRoomData(link, roomId);\n                room.classList.add(\"pnb-map-room\");\n                room.setAttribute(\"tabindex\", \"0\");\n                room.setAttribute(\"role\", \"button\");\n                room.setAttribute(\"aria-label\", data.number ? \"Sala \" + data.number + \", \" + data.title : data.title);\n\n                room.addEventListener(\"mouseenter\", function () {\n                    activateRoom(room, false);\n                });\n\n                room.addEventListener(\"focus\", function () {\n                    activateRoom(room, false);\n                });\n\n                room.addEventListener(\"mouseleave\", clearHoverState);\n                room.addEventListener(\"blur\", clearHoverState);\n\n                room.addEventListener(\"keydown\", function (event) {\n                    if (event.key === \"Enter\" || event.key === \" \") {\n                        event.preventDefault();\n                        selectRoom(room);\n                    }\n                });\n            });\n\n            map.addEventListener(\"click\", function (event) {\n                if (suppressMapClick) {\n                    suppressMapClick = false;\n                    event.preventDefault();\n                    return;\n                }\n\n                const room = getEventRoom(event.target, event);\n                if (!room) return;\n\n                event.preventDefault();\n                selectRoom(room);\n            });\n\n            const zoomIn = shell.querySelector(\".pnb-map-zoom-in\");\n            const zoomOut = shell.querySelector(\".pnb-map-zoom-out\");\n            const zoomReset = shell.querySelector(\".pnb-map-zoom-reset\");\n\n            if (zoomIn) {\n                zoomIn.addEventListener(\"click\", function () {\n                    setZoom(currentZoom + 0.15);\n                });\n            }\n\n            if (zoomOut) {\n                zoomOut.addEventListener(\"click\", function () {\n                    setZoom(currentZoom - 0.15);\n                });\n            }\n\n            if (zoomReset) {\n                zoomReset.addEventListener(\"click\", function () {\n                    panX = 0;\n                    panY = 0;\n                    setZoom(1);\n                });\n            }\n\n            stage.addEventListener(\"pointerdown\", function (event) {\n                const isMapControl = event.target.closest ? event.target.closest(\".pnb-map-controls\") : null;\n                if (currentZoom <= 1 || isMapControl) return;\n\n                event.preventDefault();\n                isPanning = true;\n                didPan = false;\n                panStart = {\n                    x: event.clientX,\n                    y: event.clientY,\n                    panX: panX,\n                    panY: panY\n                };\n\n                stage.setPointerCapture(event.pointerId);\n                stage.classList.add(\"is-panning\");\n            });\n\n            stage.addEventListener(\"pointermove\", function (event) {\n                if (!isPanning) return;\n\n                event.preventDefault();\n                const deltaX = event.clientX - panStart.x;\n                const deltaY = event.clientY - panStart.y;\n                didPan = didPan || Math.abs(deltaX) > 3 || Math.abs(deltaY) > 3;\n                panX = panStart.panX + deltaX;\n                panY = panStart.panY + deltaY;\n                applyMapTransform();\n            });\n\n            const stopPanning = function (event) {\n                if (!isPanning) return;\n\n                isPanning = false;\n                suppressMapClick = didPan;\n                stage.classList.remove(\"is-panning\");\n\n                if (stage.hasPointerCapture ? stage.hasPointerCapture(event.pointerId) : false) {\n                    stage.releasePointerCapture(event.pointerId);\n                }\n\n                if (!didPan) {\n                    const room = getEventRoom(event.target, event);\n                    if (room) {\n                        event.preventDefault();\n                        selectRoom(room);\n                    }\n                }\n            }\n\n            stage.addEventListener(\"pointerup\", stopPanning);\n            stage.addEventListener(\"pointercancel\", stopPanning);\n\n            const onMapHighlight = function (hallId) {\n                const room = getRoom(hallId);\n                if (room) {\n                    activateRoom(room, false);\n                    rooms().forEach(function (mapRoom) {\n                        mapRoom.classList.remove(\"is-list-hovered\");\n                    });\n                    room.classList.add(\"is-list-hovered\");\n                }\n            }\n\n            const onMapGroupHighlight = function (payload) {\n                const hallIds = payload ? (payload.hallIds ? payload.hallIds : []) : [];\n                rooms().forEach(function (room) {\n                    room.classList.remove(\"is-group-active\");\n                    room.classList.remove(\"is-selected\");\n                });\n\n                selectedRoomId = \"\";\n\n                hallIds.forEach(function (hallId) {\n                    const room = getRoom(hallId);\n                    if (room) {\n                        room.classList.add(\"is-group-active\");\n                    }\n                });\n\n                updateGroupPanel(payload ? (payload.title ? payload.title : \"\") : \"\", hallIds);\n            }\n\n            document.addEventListener(\"pnb:map-highlight\", function (event) {\n                onMapHighlight(event.detail ? (event.detail.hallId ? event.detail.hallId : event.detail) : event.detail);\n            });\n\n            document.addEventListener(\"pnb:map-clear\", clearHoverState);\n\n            document.addEventListener(\"pnb:map-group-highlight\", function (event) {\n                onMapGroupHighlight(event.detail || {});\n            });\n\n            if (window.jQuery) {\n                window.jQuery(document).on(\"pnb:map-highlight\", function (event, hallId) {\n                    onMapHighlight(hallId);\n                });\n\n                window.jQuery(document).on(\"pnb:map-clear\", clearHoverState);\n\n                window.jQuery(document).on(\"pnb:map-group-highlight\", function (event, payload) {\n                    onMapGroupHighlight(payload || {});\n                });\n            }\n        }\n\n        ready(function () {\n            Array.prototype.slice.call(document.querySelectorAll(\".pnb-map-shell\")).forEach(function (shell) {\n                try {\n                    initMapShell(shell);\n                } catch (error) {\n                    console.error(\"PNB map init failed\", error);\n                }\n            });\n        });\n    })();\n<\/script>\n\r\n\t\r\n\t\r\n\r\n<\/div>\r\n\n\n<div class=\"custom-map-accordions w-full grid grid-cols-2 gap-[10px] tb:flex\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div style=\"background-color: \"\n\t\t\t\t\t\t class=\"custom-accordion py-[10px] px-[20px] cursor-pointer grow\">\n\t\t\t\t\t\t<a href=\"\/palazzo-pepoli-campogrande-html\/salone-donore\" data-hall=\"1\" class=\"custom-accordion-title\">\n\t\t\t\t\t\t\t1. Salone d&#039;onore\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t<div class=\"elm-open\" style=\"background-color: \"><\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div style=\"background-color: \"\n\t\t\t\t\t\t class=\"custom-accordion py-[10px] px-[20px] cursor-pointer grow\">\n\t\t\t\t\t\t<a href=\"\/palazzo-pepoli-campogrande-html\/sala-di-felsina\" data-hall=\"2\" class=\"custom-accordion-title\">\n\t\t\t\t\t\t\t2. Sala Felsina\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t<div class=\"elm-open\" style=\"background-color: \"><\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div style=\"background-color: \"\n\t\t\t\t\t\t class=\"custom-accordion py-[10px] px-[20px] cursor-pointer grow\">\n\t\t\t\t\t\t<a href=\"\/palazzo-pepoli-campogrande-html\/sala-delle-stagioni\" data-hall=\"3\" class=\"custom-accordion-title\">\n\t\t\t\t\t\t\t3. Sala delle stagioni\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t<div class=\"elm-open\" style=\"background-color: \"><\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div style=\"background-color: \"\n\t\t\t\t\t\t class=\"custom-accordion py-[10px] px-[20px] cursor-pointer grow\">\n\t\t\t\t\t\t<a href=\"\/palazzo-pepoli-campogrande-html\/sala-dellolimpo\" data-hall=\"4\" class=\"custom-accordion-title\">\n\t\t\t\t\t\t\t4. Sala dell&#039;Olimpo\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t<div class=\"elm-open\" style=\"background-color: \"><\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div style=\"background-color: \"\n\t\t\t\t\t\t class=\"custom-accordion py-[10px] px-[20px] cursor-pointer grow\">\n\t\t\t\t\t\t<a href=\"\/palazzo-pepoli-campogrande-html\/sala-di-alessandro\" data-hall=\"5\" class=\"custom-accordion-title\">\n\t\t\t\t\t\t\t5. Sala di Alessandro\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t<div class=\"elm-open\" style=\"background-color: \"><\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t\t\t<\/div>\n\n\t\t\t<div class=\"map-accordions-values\">\n\t\t\t\t\t\t\t\t\t\t\t<div class=\"custom-accordion-item hidden\" data-accordion=\"0\">\n\t\t\t\t\t<a href=\"https:\/\/pinacotecabologna.cultura.gov.it\/en\/palazzo-pepoli-campogrande-html\" data-hall=\"0\">\n\t\t\t\t\t\t<span class=\"room-number bolder\" style=\"display: inline-block; min-width: 25px;\">0<\/span>\n\t\t\t\t\t\t<span class=\"dots\" aria-hidden=\"true\">&bull;<\/span>\n\t\t\t\t\t\t<span class=\"room-title\"><\/span>\n\t\t\t\t\t<\/a>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\n<script>\n\t(function () {\n\t\tconst ready = function (callback) {\n\t\t\tif (document.readyState === \"loading\") {\n\t\t\t\tdocument.addEventListener(\"DOMContentLoaded\", callback);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tcallback();\n\t\t}\n\n\t\tconst emitMapEvent = function (name, detail) {\n\t\t\tdocument.dispatchEvent(new CustomEvent(name, {detail: detail}));\n\t\t}\n\n\t\tconst normalizeHallId = function (target) {\n\t\t\treturn target ? target.toString().replace(\/_\/g, \"\") : \"\";\n\t\t}\n\n\t\tconst getMapRooms = function () {\n\t\t\treturn Array.prototype.slice.call(document.querySelectorAll(\".pnb-interactive-map .pnb-map-room\"));\n\t\t}\n\n\t\tconst getMapRoom = function (hallId) {\n\t\t\tconst normalizedHallId = normalizeHallId(hallId);\n\t\t\tif (!normalizedHallId) return null;\n\n\t\t\treturn getMapRooms().filter(function (room) {\n\t\t\t\treturn normalizeHallId(room.getAttribute(\"id\")) === normalizedHallId;\n\t\t\t})[0] || null;\n\t\t}\n\n\t\tconst clearLinkedListItems = function () {\n\t\t\tdocument.querySelectorAll(\".map-accordions-values a.pnb-map-linked-active, .custom-map-accordions a.pnb-map-linked-active\").forEach(function (link) {\n\t\t\t\tlink.classList.remove(\"pnb-map-linked-active\");\n\t\t\t});\n\t\t}\n\n\t\tconst syncGroupHighlight = function (hallIds) {\n\t\t\tgetMapRooms().forEach(function (room) {\n\t\t\t\troom.classList.remove(\"is-active\");\n\t\t\t\troom.classList.remove(\"is-list-hovered\");\n\t\t\t\troom.classList.remove(\"is-group-active\");\n\t\t\t\troom.classList.remove(\"is-selected\");\n\t\t\t});\n\n\t\t\thallIds.forEach(function (hallId) {\n\t\t\t\tconst room = getMapRoom(hallId);\n\t\t\t\tif (room) {\n\t\t\t\t\troom.classList.add(\"is-group-active\");\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tconst syncRoomHover = function (hallId) {\n\t\t\tgetMapRooms().forEach(function (room) {\n\t\t\t\troom.classList.remove(\"is-active\");\n\t\t\t\troom.classList.remove(\"is-list-hovered\");\n\t\t\t});\n\t\t\tclearLinkedListItems();\n\n\t\t\tconst room = getMapRoom(hallId);\n\t\t\tif (room) {\n\t\t\t\troom.classList.add(\"is-active\");\n\t\t\t\troom.classList.add(\"is-list-hovered\");\n\t\t\t}\n\n\t\t\tdocument.querySelectorAll(\"a[data-hall]\").forEach(function (link) {\n\t\t\t\tif (normalizeHallId(link.getAttribute(\"data-hall\")) === normalizeHallId(hallId)) {\n\t\t\t\t\tlink.classList.add(\"pnb-map-linked-active\");\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tconst clearRoomHover = function () {\n\t\t\tgetMapRooms().forEach(function (room) {\n\t\t\t\troom.classList.remove(\"is-active\");\n\t\t\t\troom.classList.remove(\"is-list-hovered\");\n\t\t\t});\n\t\t\tclearLinkedListItems();\n\t\t}\n\n\t\tconst openAccordion = function (accordion) {\n\t\t\tif (!accordion || !accordion.getAttribute(\"data-accordion\")) return;\n\n\t\t\tdocument.querySelectorAll(\".custom-map-accordions .custom-accordion\").forEach(function (item) {\n\t\t\t\titem.classList.remove(\"open\");\n\t\t\t\titem.setAttribute(\"aria-expanded\", \"false\");\n\t\t\t});\n\n\t\t\taccordion.classList.add(\"open\");\n\t\t\taccordion.setAttribute(\"aria-expanded\", \"true\");\n\n\t\t\tconst color = accordion.getAttribute(\"data-color\");\n\t\t\tconst accordionId = accordion.getAttribute(\"data-accordion\");\n\t\t\tconst items = Array.prototype.slice.call(document.querySelectorAll('.map-accordions-values .custom-accordion-item[data-accordion=\"' + accordionId + '\"]'));\n\t\t\tconst hallIds = items.map(function (item) {\n\t\t\t\tconst link = item.querySelector(\"a[data-hall]\");\n\t\t\t\treturn link ? link.getAttribute(\"data-hall\").toString() : \"\";\n\t\t\t}).filter(Boolean);\n\t\t\tconst titleElement = accordion.querySelector(\".custom-accordion-title\");\n\t\t\tconst title = titleElement ? titleElement.textContent.trim() : \"\";\n\t\t\tconst values = document.querySelector(\".map-accordions-values\");\n\n\t\t\tdocument.querySelectorAll(\".map-accordions-values .custom-accordion-item\").forEach(function (item) {\n\t\t\t\titem.classList.add(\"hidden\");\n\t\t\t});\n\n\t\t\titems.forEach(function (item) {\n\t\t\t\titem.classList.remove(\"hidden\");\n\t\t\t});\n\n\t\t\tif (values) {\n\t\t\t\tvalues.style.backgroundColor = color;\n\t\t\t}\n\n\t\t\temitMapEvent(\"pnb:map-group-highlight\", {hallIds: hallIds, title: title});\n\t\t\tsyncGroupHighlight(hallIds);\n\t\t}\n\n\t\tconst getHallLink = function (target) {\n\t\t\treturn target && target.closest ? target.closest(\".map-accordions-values a[data-hall], .custom-map-accordions a[data-hall]\") : null;\n\t\t}\n\n\t\tready(function () {\n\t\t\tdocument.addEventListener(\"click\", function (event) {\n\t\t\t\tconst accordion = event.target.closest ? event.target.closest(\".custom-map-accordions .custom-accordion\") : null;\n\t\t\t\tif (accordion) {\n\t\t\t\t\topenAccordion(accordion);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tdocument.addEventListener(\"keydown\", function (event) {\n\t\t\t\tconst accordion = event.target.closest ? event.target.closest(\".custom-map-accordions .custom-accordion\") : null;\n\t\t\t\tif (!accordion || (event.key !== \"Enter\" && event.key !== \" \")) return;\n\n\t\t\t\tevent.preventDefault();\n\t\t\t\topenAccordion(accordion);\n\t\t\t});\n\n\t\t\tdocument.addEventListener(\"mouseover\", function (event) {\n\t\t\t\tconst link = getHallLink(event.target);\n\t\t\t\tif (!link || (event.relatedTarget && link.contains(event.relatedTarget))) return;\n\n\t\t\t\tconst hallId = link.getAttribute(\"data-hall\").toString();\n\t\t\t\temitMapEvent(\"pnb:map-highlight\", {hallId: hallId});\n\t\t\t\tsyncRoomHover(hallId);\n\t\t\t});\n\n\t\t\tdocument.addEventListener(\"focusin\", function (event) {\n\t\t\t\tconst link = getHallLink(event.target);\n\t\t\t\tif (!link) return;\n\n\t\t\t\tconst hallId = link.getAttribute(\"data-hall\").toString();\n\t\t\t\temitMapEvent(\"pnb:map-highlight\", {hallId: hallId});\n\t\t\t\tsyncRoomHover(hallId);\n\t\t\t});\n\n\t\t\tdocument.addEventListener(\"mouseout\", function (event) {\n\t\t\t\tconst link = getHallLink(event.target);\n\t\t\t\tif (!link || (event.relatedTarget && link.contains(event.relatedTarget))) return;\n\n\t\t\t\temitMapEvent(\"pnb:map-clear\", {});\n\t\t\t\tclearRoomHover();\n\t\t\t});\n\n\t\t\tdocument.addEventListener(\"focusout\", function (event) {\n\t\t\t\tconst link = getHallLink(event.target);\n\t\t\t\tif (!link) return;\n\n\t\t\t\temitMapEvent(\"pnb:map-clear\", {});\n\t\t\t\tclearRoomHover();\n\t\t\t});\n\t\t});\n\t})();\n<\/script>\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":12,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-8258","page","type-page","status-publish","hentry"],"featured_image_src":null,"featured_image_src_square":null,"_links":{"self":[{"href":"https:\/\/pinacotecabologna.cultura.gov.it\/en\/wp-json\/wp\/v2\/pages\/8258","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/pinacotecabologna.cultura.gov.it\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/pinacotecabologna.cultura.gov.it\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/pinacotecabologna.cultura.gov.it\/en\/wp-json\/wp\/v2\/users\/12"}],"replies":[{"embeddable":true,"href":"https:\/\/pinacotecabologna.cultura.gov.it\/en\/wp-json\/wp\/v2\/comments?post=8258"}],"version-history":[{"count":57,"href":"https:\/\/pinacotecabologna.cultura.gov.it\/en\/wp-json\/wp\/v2\/pages\/8258\/revisions"}],"predecessor-version":[{"id":15412,"href":"https:\/\/pinacotecabologna.cultura.gov.it\/en\/wp-json\/wp\/v2\/pages\/8258\/revisions\/15412"}],"wp:attachment":[{"href":"https:\/\/pinacotecabologna.cultura.gov.it\/en\/wp-json\/wp\/v2\/media?parent=8258"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}