{"id":340,"date":"2025-09-02T16:13:54","date_gmt":"2025-09-02T14:13:54","guid":{"rendered":"https:\/\/www.fondazioneunipolis.org\/site\/?page_id=340"},"modified":"2026-01-20T16:22:50","modified_gmt":"2026-01-20T15:22:50","slug":"bandi","status":"publish","type":"page","link":"https:\/\/www.fondazioneunipolis.org\/site\/bandi\/","title":{"rendered":"Bandi"},"content":{"rendered":"\n\n    <section class=\"hero-section background-dark-blue\">\n      <div class=\"hero-carousel\">\n        <div class=\"hero-slide\">\n          <img class=\"illustration-bottom\" src=\"https:\/\/www.fondazioneunipolis.org\/site\/wp-content\/uploads\/2025\/09\/vector-attivita-desktop-1.png\" alt=\"\" \/>\n          <img class=\"illustration-top\" src=\"https:\/\/www.fondazioneunipolis.org\/site\/wp-content\/uploads\/2025\/09\/bandi-hero-spilla.png\" alt=\"\" \/>\n\n          <div class=\"container\">\n            <h1 class=\"main-title\" data-animate=\"words\">\n              Bandi            <\/h1>\n                          <p class=\"main-description\" data-animate=\"words\">\n                  Unipolis sostiene progetti che affrontano disuguaglianza, welfare e mobilit\u00e0 sostenibile. In questa sezione puoi consultare tutti i bandi pubblicati, ordinati per ambito e anno.              <\/p>\n                      <\/div>\n        <\/div>\n      <\/div>\n    <\/section>\n    \n\n\n\n    <!-- Filter Dashboard Section -->\n    <section class=\"filter-section\">\n        <div class=\"container\">\n            <!-- Filter Chips Container -->\n            <div class=\"chips-container\">\n                                                            <button class=\"chip-filter\" data-filter=\"disuguaglianze\">\n                            Disuguaglianze                        <\/button>\n                                            <button class=\"chip-filter\" data-filter=\"mobilita\">\n                            Mobilit\u00e0                        <\/button>\n                                            <button class=\"chip-filter\" data-filter=\"welfare\">\n                            Welfare                        <\/button>\n                                    \n                <!-- Year Select Field -->\n                <div class=\"custom-select-container\" data-selected=\"\">\n                    <button class=\"custom-select-button\" id=\"customSelect\">\n                        <span class=\"select-text\">Anno<\/span>\n                        <svg\n                            class=\"select-arrow\"\n                            width=\"24\"\n                            height=\"24\"\n                            viewBox=\"0 0 24 24\"\n                            fill=\"#191918\">\n                            <path\n                                d=\"M16.59 8.29492L12 12.8749L7.41 8.29492L6 9.70492L12 15.7049L18 9.70492L16.59 8.29492Z\"\n                                fill=\"#191918\" \/>\n                        <\/svg>\n                    <\/button>\n                    <div class=\"custom-select-dropdown\" id=\"customDropdown\">\n                        <button class=\"custom-option\" data-value=\"\">Anno<\/button>\n                                                                                    <button class=\"custom-option\" data-value=\"2026\">2026<\/button>\n                                                            <button class=\"custom-option\" data-value=\"2025\">2025<\/button>\n                                                            <button class=\"custom-option\" data-value=\"2024\">2024<\/button>\n                                                                        <\/div>\n                <\/div>\n            <\/div>\n            <!-- Toggle Switch Container -->\n            <div class=\"toggle-container\">                \n                <span class=\"switch-label\">Mostra solo in corso<\/span>\n                <button class=\"switch-button active\" id=\"toggleSwitch\">\n                    <div class=\"switch-thumb\"><\/div>\n                <\/button>                \n            <\/div>\n        <\/div>\n    <\/section>\n\n    <section class=\"areas-container\" style=\"background: linear-gradient(180deg, #00355F 0%, #00355F calc(100% - 580px), transparent calc(100% - 580px), transparent 100%), url('https:\/\/www.fondazioneunipolis.org\/site\/wp-content\/uploads\/2025\/09\/vector1.png') no-repeat center bottom \/ 100% 600px transparent;\">\n        <div class=\"container\" id=\"result-container\">\n        <\/div>\n    <\/section>\n\n    <script>\n        class CustomSelect {\n            constructor(container) {\n                this.container = container;\n                this.button = container.querySelector(\".custom-select-button\");\n                this.dropdown = container.querySelector(\".custom-select-dropdown\");\n                this.options = container.querySelectorAll(\".custom-option\");\n                this.textElement = container.querySelector(\".select-text\");\n                this.isOpen = false;\n                this.selectedValue = \"\";\n\n                this.init();\n            }\n\n            init() {\n                \/\/ Event listeners\n                this.button.addEventListener(\"click\", () => this.toggle());\n\n                this.options.forEach((option) => {\n                    option.addEventListener(\"click\", (e) => this.selectOption(e));\n                });\n\n                \/\/ Chiudi quando si clicca fuori\n                document.addEventListener(\"click\", (e) => {\n                    if (!this.container.contains(e.target)) {\n                        this.close();\n                    }\n                });\n\n                \/\/ Gestione tastiera\n                this.button.addEventListener(\"keydown\", (e) => {\n                    if (e.key === \"Enter\" || e.key === \" \") {\n                        e.preventDefault();\n                        this.toggle();\n                    } else if (e.key === \"Escape\") {\n                        this.close();\n                    }\n                });\n            }\n\n            toggle() {\n                this.isOpen ? this.close() : this.open();\n            }\n\n            open() {\n                this.isOpen = true;\n                this.button.classList.add(\"open\");\n                this.dropdown.classList.add(\"open\");\n                this.button.setAttribute(\"aria-expanded\", \"true\");\n            }\n\n            close() {\n                this.isOpen = false;\n                this.button.classList.remove(\"open\");\n                this.dropdown.classList.remove(\"open\");\n                this.button.setAttribute(\"aria-expanded\", \"false\");\n            }\n\n            selectOption(e) {\n                const option = e.target;\n                const value = option.dataset.value;\n                const text = option.textContent;\n\n                \/\/ Aggiorna selezione visiva\n                this.options.forEach((opt) => opt.classList.remove(\"selected\"));\n                option.classList.add(\"selected\");\n\n                \/\/ Aggiorna testo e valore\n                this.textElement.textContent = text;\n                this.selectedValue = value;\n\n                \/\/ Chiudi dropdown\n                this.close();\n\n                \/\/ Trigger evento personalizzato\n                this.container.dispatchEvent(\n                    new CustomEvent(\"change\", {\n                        detail: {\n                            value,\n                            text\n                        },\n                    })\n                );\n            }\n\n            getValue() {\n                return this.selectedValue;\n            }\n\n            setValue(value) {\n                const option = Array.from(this.options).find(\n                    (opt) => opt.dataset.value === value\n                );\n                if (option) {\n                    option.click();\n                }\n            }\n        }\n\n        document.addEventListener(\"DOMContentLoaded\", function() {\n            initializeFilterChips();\n            initializeYearSelect();\n            initializeToggleSwitch();\n        });\n\n        function initializeFilterChips() {\n            const filterChips = document.querySelectorAll(\".chip-filter\");\n\n            filterChips.forEach((chip) => {\n                chip.addEventListener(\"click\", function() {\n\n                    this.classList.toggle(\"active\");\n\n                    const filterValue = this.getAttribute(\"data-filter\");\n\n                    handleFilterChange();\n                });\n\n                chip.addEventListener(\"keydown\", function(e) {\n                    if (e.key === \"Enter\" || e.key === \" \") {\n                        e.preventDefault();\n                        this.click();\n                    }\n                });\n            });\n        }\n\n        \/\/ Initialize Year Select\n        function initializeYearSelect() {\n\n            \/\/ Inizializza la select personalizzata\n            const customSelectContainer = document.querySelector(\n                \".custom-select-container\"\n            );\n            const customSelect = new CustomSelect(customSelectContainer);\n\n            \/\/ Esempio di utilizzo - ascolta i cambiamenti\n            customSelectContainer.addEventListener(\"change\", (e) => {\n                customSelectContainer.setAttribute(\"data-selected\", e.detail.value);\n                handleFilterChange();\n            });\n\n        }\n\n        \/\/ Initialize Toggle Switch\n        function initializeToggleSwitch() {\n            const toggleSwitch = document.getElementById(\"toggleSwitch\");\n\n            toggleSwitch.addEventListener(\"click\", () => {\n                const isActive = toggleSwitch.classList.toggle(\"active\");\n\n                toggleSwitch.setAttribute(\"aria-checked\", isActive.toString());\n\n                handleFilterChange();\n            });\n\n            \/\/ Add keyboard support\n            toggleSwitch.addEventListener(\"keydown\", function(e) {\n                if (e.key === \"Enter\" || e.key === \" \") {\n                    e.preventDefault();\n                    this.click();\n                }\n            });\n        }\n\n        \/\/ Handle Filter Changes\n        function handleFilterChange() {\n            const activeFilters = [];\n            const filterChips = document.querySelectorAll(\".chip-filter.active\");\n            const yearSelect = document.querySelector(\".custom-select-container\");\n            const toggleSwitch = document.getElementById(\"toggleSwitch\");\n\n            \/\/ Chip attivi\n            filterChips.forEach((chip) => {\n                activeFilters.push(chip.getAttribute(\"data-filter\"));\n            });\n\n            \/\/ Recupera l'anno dal data-selected\n            let selectedYear = null;\n            if (yearSelect) {\n                selectedYear = yearSelect.getAttribute(\"data-selected\");\n            }\n\n            \/\/ Recupera stato toggle\n            const toggleActive = toggleSwitch?.classList.contains(\"active\") || false;\n\n            const filters = {\n                chips: activeFilters,\n                year: selectedYear,\n                toggle: toggleActive\n            };\n\n            updateAriaAttributes();\n            applyFilters(filters);\n        }\n\n        function applyFilters(activeFilters) {\n            \/\/Devo fare la chiamata ajax al mio hook personalizzato (no admin-ajax) per recuperare i bandi filtrati\n            console.log(\"active Filters\", activeFilters);\n\n            const apiUrl = \"https:\/\/www.fondazioneunipolis.org\/site\/wp-json\/unipolis\/v1\/filtra-bandi\";\n            fetch(apiUrl, {\n                    method: \"POST\",\n                    headers: {\n                        \"Content-Type\": \"application\/json\",\n                    },\n                    body: JSON.stringify(activeFilters),\n                })\n                .then(response => {\n                    if (!response.ok) {\n                        throw new Error(\"Errore nella richiesta AJAX\");\n                    }\n                    return response.json();\n                })\n                .then(data => {\n                    \/\/ Qui aggiorna il DOM con i dati ricevuti\n                    document.getElementById('result-container').innerHTML = data;\n                })\n                .catch(error => {\n                    console.error(\"Errore nel filtro:\", error);\n                });\n        }\n\n        \/\/ Accessibility improvements\n        document.addEventListener(\"DOMContentLoaded\", function() {\n            \/\/ Add ARIA labels for better accessibility\n            const filterChips = document.querySelectorAll(\".chip-filter\");\n            filterChips.forEach((chip, index) => {\n                chip.setAttribute(\"role\", \"button\");\n                chip.setAttribute(\"aria-pressed\", \"false\");\n                chip.setAttribute(\"tabindex\", \"0\");\n            });\n\n            const toggleSwitch = document.getElementById(\"toggleSwitch\");\n\n            let toggleValue = false;\n\n            if (toggleSwitch) {\n                toggleValue = toggleSwitch.classList.contains(\"active\");\n\n                toggleSwitch.setAttribute(\"role\", \"switch\");\n                toggleSwitch.setAttribute(\"aria-checked\", toggleValue.toString());\n                toggleSwitch.setAttribute(\"tabindex\", \"0\");\n            }\n\n            \/\/chiamata iniziale per recuperare i progetti senza filtri\n            applyFilters({\n                chips: [],\n                year: null,\n                toggle: toggleValue\n            });\n\n        });\n\n        \/\/ Update ARIA attributes when states change\n        function updateAriaAttributes() {\n            \/\/ Update filter chips\n            const filterChips = document.querySelectorAll(\".chip-filter\");\n            filterChips.forEach((chip) => {\n                const isActive = chip.classList.contains(\"active\");\n                chip.setAttribute(\"aria-pressed\", isActive.toString());\n            });\n\n            \/\/ Update toggle switch\n            const toggleSwitch = document.getElementById(\"toggleSwitch\");\n            if (toggleSwitch) {\n                const isActive = toggleSwitch.classList.contains(\"active\");\n                toggleSwitch.setAttribute(\"aria-checked\", isActive.toString());\n            }\n        }\n    <\/script>\n\n\n\n\n    <section class=\"newsletter newsletter-merged\">\n        <div class=\"container newsletter-content\">\n            <div class=\"container\">\n                <div class=\"content-wrapper\">\n                    <h2 class=\"title-newsletter\" data-animate=\"words\">Iscriviti<br \/>alla nostra<br \/>newsletter<\/h2>\n                    <p class=\"paragraph\" data-animate=\"words\">\n                        Non perderti aggiornamenti su bandi,<br \/>progetti, notizie ed informazioni<br \/>sulla nostra Fondazione.                    <\/p>\n                                            <a class=\"unipolis-button white-button\" href=\"https:\/\/mn.fondazioneunipolis.org\/iscrizionefondazione\" data-animate=\"words\">\n                            ISCRIVITI ALLA NEWSLETTER                        <\/a>\n                    \n                                            <img\n                            src=\"https:\/\/www.fondazioneunipolis.org\/site\/wp-content\/uploads\/2025\/08\/vector-yellow.png\"\n                            alt=\"\"\n                            class=\"line-yellow\" \n                        \/>\n                                          \n\n                                            <img\n                            src=\"https:\/\/www.fondazioneunipolis.org\/site\/wp-content\/uploads\/2025\/08\/omino.png\"\n                            alt=\"\"\n                            class=\"omino-seduto\" \n                        \/>\n                                        \n                <\/div>\n                              \n                            <\/div>\n        <\/div>\n    <\/section>\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,"footnotes":""},"class_list":["post-340","page","type-page","status-publish","hentry"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.1.1 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Bandi - Unipolis<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.fondazioneunipolis.org\/site\/bandi\/\" \/>\n<meta property=\"og:locale\" content=\"it_IT\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Bandi - Unipolis\" \/>\n<meta property=\"og:url\" content=\"https:\/\/dx-factory-unipolis-corporate-wp.ha.servizi.gr-u.it\/site\/bandi\/\" \/>\n<meta property=\"og:site_name\" content=\"Unipolis\" \/>\n<meta property=\"article:modified_time\" content=\"2026-01-20T15:22:50+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/dx-factory-unipolis-corporate-wp.ha.servizi.gr-u.it\/site\/bandi\/\",\"url\":\"https:\/\/dx-factory-unipolis-corporate-wp.ha.servizi.gr-u.it\/site\/bandi\/\",\"name\":\"Bandi - Unipolis\",\"isPartOf\":{\"@id\":\"https:\/\/www.fondazioneunipolis.org\/site\/#website\"},\"datePublished\":\"2025-09-02T14:13:54+00:00\",\"dateModified\":\"2026-01-20T15:22:50+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/dx-factory-unipolis-corporate-wp.ha.servizi.gr-u.it\/site\/bandi\/#breadcrumb\"},\"inLanguage\":\"it-IT\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/dx-factory-unipolis-corporate-wp.ha.servizi.gr-u.it\/site\/bandi\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/dx-factory-unipolis-corporate-wp.ha.servizi.gr-u.it\/site\/bandi\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.fondazioneunipolis.org\/site\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Bandi\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.fondazioneunipolis.org\/site\/#website\",\"url\":\"https:\/\/www.fondazioneunipolis.org\/site\/\",\"name\":\"Unipolis\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\/\/www.fondazioneunipolis.org\/site\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.fondazioneunipolis.org\/site\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"it-IT\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.fondazioneunipolis.org\/site\/#organization\",\"name\":\"Unipolis\",\"url\":\"https:\/\/www.fondazioneunipolis.org\/site\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"it-IT\",\"@id\":\"https:\/\/www.fondazioneunipolis.org\/site\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.fondazioneunipolis.org\/site\/wp-content\/uploads\/2025\/07\/logo-fondazione-unipolis-1.svg\",\"contentUrl\":\"https:\/\/www.fondazioneunipolis.org\/site\/wp-content\/uploads\/2025\/07\/logo-fondazione-unipolis-1.svg\",\"caption\":\"Unipolis\"},\"image\":{\"@id\":\"https:\/\/www.fondazioneunipolis.org\/site\/#\/schema\/logo\/image\/\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Bandi - Unipolis","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.fondazioneunipolis.org\/site\/bandi\/","og_locale":"it_IT","og_type":"article","og_title":"Bandi - Unipolis","og_url":"https:\/\/dx-factory-unipolis-corporate-wp.ha.servizi.gr-u.it\/site\/bandi\/","og_site_name":"Unipolis","article_modified_time":"2026-01-20T15:22:50+00:00","twitter_card":"summary_large_image","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/dx-factory-unipolis-corporate-wp.ha.servizi.gr-u.it\/site\/bandi\/","url":"https:\/\/dx-factory-unipolis-corporate-wp.ha.servizi.gr-u.it\/site\/bandi\/","name":"Bandi - Unipolis","isPartOf":{"@id":"https:\/\/www.fondazioneunipolis.org\/site\/#website"},"datePublished":"2025-09-02T14:13:54+00:00","dateModified":"2026-01-20T15:22:50+00:00","breadcrumb":{"@id":"https:\/\/dx-factory-unipolis-corporate-wp.ha.servizi.gr-u.it\/site\/bandi\/#breadcrumb"},"inLanguage":"it-IT","potentialAction":[{"@type":"ReadAction","target":["https:\/\/dx-factory-unipolis-corporate-wp.ha.servizi.gr-u.it\/site\/bandi\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/dx-factory-unipolis-corporate-wp.ha.servizi.gr-u.it\/site\/bandi\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.fondazioneunipolis.org\/site\/"},{"@type":"ListItem","position":2,"name":"Bandi"}]},{"@type":"WebSite","@id":"https:\/\/www.fondazioneunipolis.org\/site\/#website","url":"https:\/\/www.fondazioneunipolis.org\/site\/","name":"Unipolis","description":"","publisher":{"@id":"https:\/\/www.fondazioneunipolis.org\/site\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.fondazioneunipolis.org\/site\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"it-IT"},{"@type":"Organization","@id":"https:\/\/www.fondazioneunipolis.org\/site\/#organization","name":"Unipolis","url":"https:\/\/www.fondazioneunipolis.org\/site\/","logo":{"@type":"ImageObject","inLanguage":"it-IT","@id":"https:\/\/www.fondazioneunipolis.org\/site\/#\/schema\/logo\/image\/","url":"https:\/\/www.fondazioneunipolis.org\/site\/wp-content\/uploads\/2025\/07\/logo-fondazione-unipolis-1.svg","contentUrl":"https:\/\/www.fondazioneunipolis.org\/site\/wp-content\/uploads\/2025\/07\/logo-fondazione-unipolis-1.svg","caption":"Unipolis"},"image":{"@id":"https:\/\/www.fondazioneunipolis.org\/site\/#\/schema\/logo\/image\/"}}]}},"_links":{"self":[{"href":"https:\/\/www.fondazioneunipolis.org\/site\/wp-json\/wp\/v2\/pages\/340","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.fondazioneunipolis.org\/site\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.fondazioneunipolis.org\/site\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.fondazioneunipolis.org\/site\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.fondazioneunipolis.org\/site\/wp-json\/wp\/v2\/comments?post=340"}],"version-history":[{"count":13,"href":"https:\/\/www.fondazioneunipolis.org\/site\/wp-json\/wp\/v2\/pages\/340\/revisions"}],"predecessor-version":[{"id":11770,"href":"https:\/\/www.fondazioneunipolis.org\/site\/wp-json\/wp\/v2\/pages\/340\/revisions\/11770"}],"wp:attachment":[{"href":"https:\/\/www.fondazioneunipolis.org\/site\/wp-json\/wp\/v2\/media?parent=340"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}