Gràcies als sistemes de videovigilància, els professionals de TMB vetllen per la teva seguretat durant totes les hores del servei, tant a metro com a bus.
Et trobes a:
Sempre hi som
El metro i els busos tenen càmeres de videovigilància en temps real perquè viatgis amb seguretat.
Videovigilància al metro
La xarxa de metro compta amb gairebé 10.000 càmeres que estan repartides per trens i estacions i també a cotxeres, tallers i altres dependències de TMB.
Aquestes càmeres permeten veure el que està passant en directe quan un usuari prem el botó SOS o el d’informació en un tren o en una estació. Les imatges captades per aquests dispositius de videovigilància es reben al Centre de Control de Metro i al Centre de Seguretat i Protecció Civil.
Videovigilància al bus
La xarxa de bus disposa de més de 4.500 càmeres que actualment cobreixen pràcticament tot el servei regular de la flota.
Aquest sistema de videovigilància permet al Centre de Control de Seguretat de Bus visualitzar en temps real imatges de l’interior dels vehicles, així com descarregar al moment qualsevol de les gravacions.
Imatges a disposició dels cossos de seguretat
Les imatges captades per aquests dispositius de videovigilància tant de la xarxa de bus com la de metro queden enregistrades i poden ser revisades quan els Mossos d’Esquadra o altres cossos de seguretat ho requereixin.
-
FinalitzatCampanya
Quan viatgis en bus, fes-ho fàcil
El teu trajecte serà més àgil i pràctic, i també facilitaràs la feina al conductor. -
FinalitzatCampanya
Quan viatgis en metro, fes-ho de manera segura
Nosaltres vetllem per la teva seguretat, tu evites accions que posen en perill la teva integritat i el bon funcionament del servei. -
FinalitzatCampanya
Millor AMBici!
La bicicleta elèctrica metropolitana
Et trobes a:
Millor AMBici!
La bicicleta elèctrica metropolitana
Més de 200 estacions que et connecten al transport i a altres municipis, i més de 2.500 bicicletes 100% elèctriques perquè pedalegis còmodament fins al teu destí.
De casa a la feina
Moure’s millor és desplaçar-se de forma saludable mantenint un estil de vida actiu, amb bicicletes 100% elèctriques que incorporen assistència a la pedalada.
Per connectar amb el transport públic
Moure’s millor és desplaçar-se de forma econòmica i evitar embussos. Connecta amb altres opcions de transport públic, viatja per 15 municipis de l’àrea metropolitana i, si vols, pedaleja fins arribar a Barcelona.
Per una ciutat sense fum
Moure’s millor és desplaçar-se de forma sostenible, amb zero emissions, i reduir el soroll de les ciutats i la contaminació de l’aire.
-
FinalitzatCampanya
Quan viatgis en bus, fes-ho fàcil
El teu trajecte serà més àgil i pràctic, i també facilitaràs la feina al conductor. -
FinalitzatCampanya
Sempre hi som
El metro i els busos tenen càmeres de videovigilància en temps real perquè viatgis amb seguretat. -
FinalitzatCampanya
Quan viatgis en metro, fes-ho de manera segura
Nosaltres vetllem per la teva seguretat, tu evites accions que posen en perill la teva integritat i el bon funcionament del servei.
Et trobes a:
Quan viatgis en metro, fes-ho de manera segura
Nosaltres vetllem per la teva seguretat, tu evites accions que posen en perill la teva integritat i el bon funcionament del servei.
No baixis a les vies
Mai no baixis a les vies. No ho facis sota cap concepte.
- Si has de creuar a l’altra andana, fes-ho utilitzant les escales o els ascensors.
- Si t’ha caigut algun objecte a la via, acciona l’intèrfon SOS de l’andana i t’ajudarem a recuperar-lo quan sigui possible.
- Actua cívicament, respecta les instal·lacions.
Baixar a la via, no és la via. Comporta risc de mort.
No pugis al tren quan s’estiguin tancant les portes
Quan s’activa l’avís de tancament de portes, no es pot entrar ni sortir del vagó.
- Si arribes a l’andana i el tren fa sonar l’avís de tancament de portes (sonora i visual), és imprescindible que el respectis i esperis el següent tren.
Un cop s’inicï l’avís sonor/visual, ja no s’hi pot pujar.
- Si ets a bord del tren i t’adones tard que has de baixar, cal que esperis a la següent estació. Quan hi arribis, podràs baixar i tornar enrere fins on volies anar.
Un cop s’inicï l’avís sonor/visual, ja no s’hi pot baixar.
- Mai no intentis forçar les portes del tren. Hi podries quedar atrapat i patir un accident molt greu.
Si et trobes malament al metro, demana ajuda
Tant si ets a l’andana com dins el vagó, fer servir l’intèrfon SOS. El metro disposa de 2.300 intèrfons distribuïts a totes les andanes i vestíbuls de les estacions.
- Quan comencis a trobar-te malament, surt del tren en el possible i demana ajuda a l’intèrfon SOS de l’andana, o mira si algú ho pot fer per tu.
- Si els símptomes apareixen abans de pujar al tren, queda’t a l’andana i prem el botó SOS de l’intèrfon.
- Si sospites que una persona està patint una aturada cardíaca, localitza el desfibril·lador a l’andana i segueix les instruccions. La xarxa de metro està cardioprotegida.
Més informació
Trobaràs més informació a Com es viatja en metro.
Recorda!
No baixis mai a la via, comporta risc de mort.
No pugis al tren quan s'estiguin tancant les portes.
Si et trobes malament, no pugis al vagó. Demana ajuda a l’intèrfon SOS de l’andana.
-
FinalitzatCampanya
Millor AMBici!
La bicicleta elèctrica metropolitana -
FinalitzatCampanya
Quan viatgis en bus, fes-ho fàcil
El teu trajecte serà més àgil i pràctic, i també facilitaràs la feina al conductor. -
FinalitzatCampanya
Sempre hi som
El metro i els busos tenen càmeres de videovigilància en temps real perquè viatgis amb seguretat.
Et trobes a:
Posa't a la seva pell, no al seu lloc
Respecta la prioritat absoluta al transport públic.
Atenció!
Al bus i al metro, els espais reservats per a cadires de rodes són reservats per a cadires de rodes. A més, les persones amb discapacitat o mobilitat reduïda tenen prioritat absoluta per seure als seients d'ús preferent i per utilitzar l'ascensor.
Posa't a la seva pell, no al seu lloc.
Al bus i al metro, dona prioritat absoluta a qui ho necessiti
Des de Transports Metropolitans de Barcelona i l'Institut Municipal de Persones amb Discapacitat fomentem l'ús correcte dels seients preferents, els espais reservats per a cadires de rodes i els ascensors de la xarxa de transport públic de la ciutat.
Donant més visibilitat al col·lectiu de persones amb mobilitat reduïda i persones amb discapacitat, esperem arribar a les consciències de les persones usuàries que no respecten aquests espais, i no sempre de manera intencionada.
Els testimonis d'aquesta campanya són reals, ja que la seva problemàtica també és molt real.
-
FinalitzatCampanya
Quan viatgis en bus, fes-ho fàcil
El teu trajecte serà més àgil i pràctic, i també facilitaràs la feina al conductor. -
FinalitzatCampanya
Quan viatgis en metro, fes-ho de manera segura
Nosaltres vetllem per la teva seguretat, tu evites accions que posen en perill la teva integritat i el bon funcionament del servei. -
FinalitzatCampanya
Sempre hi som
El metro i els busos tenen càmeres de videovigilància en temps real perquè viatgis amb seguretat.
Et trobes a:
La comunitat TMB supera el milió i mig de seguidors
La comunitat d’usuaris de TMB que ens segueixen a les xarxes socials i a JoTMBé ja sumen més d’un milió i mig de persones.
Xarxes socials i JoTMBé
A TMB estem d'enhorabona! La nostra comunitat d’usuaris continua creixent i les persones connectades a través dels nostres perfils a les xarxes socials i a JoTMBé ja són més d’un milió i mig.
Sou molts els que ens seguiu a Instagram, Facebook, X, LinkedIn, Spotify, YouTube i WeChat per estar al dia de totes les novetats, serveis i iniciatives que posem en marxa. I, des del 31 de gener de 2025, també a TikTok.
A més, a través de JoTMBé, milers de vosaltres gaudiu d’informació actualitzada del servei, avantatges exclusius i compreu i recarregueu títols de transport amb total agilitat. També els subscriptors del blog Hola Barcelona aprofiteu les millors propostes i consells per no perdre-us res de la ciutat.
Volem agrair-vos la confiança i suport. La vostra participació és clau per continuar millorant dia a dia i oferir-vos el millor servei possible.
Ens queda molt de camí per recórrer junts!
Suma’t a la comunitat de TMB i viu el transport públic com mai abans!
Segueix-nos a les nostres xarxes socials, registra’t a JoTMBé i subscriu-te al butlletí del blog Hola Barcelona per descobrir tot el que tenim preparat per a tu. Estaràs al dia de les novetats, podràs participar en concursos, rebràs consells per als teus trajectes, accediràs a promocions exclusives i molts més avantatges de formar-ne part.
També et poden interessar
-
FinalitzatCampanya
Posa't a la seva pell, no al seu lloc
Respecta la prioritat absoluta al transport públic. -
FinalitzatCampanya
Quan viatgis en metro, fes-ho de manera segura
Nosaltres vetllem per la teva seguretat, tu evites accions que posen en perill la teva integritat i el bon funcionament del servei. -
FinalitzatCampanya
Quan viatgis en bus, fes-ho fàcil
El teu trajecte serà més àgil i pràctic, i també facilitaràs la feina al conductor.

Et trobes a:
Dansa Metropolitana al metro
Transformem la quotidianitat del metro en una experiència artística i emocional que connecti els usuaris amb un instant de contemplació.
Quan: 15.03.2025
On: Estació Universitat L1
Accés: Entrada gratuïta*
El 15 de març a les 12h, els usuaris i usuàries del metro poden gaudir d’una experiència artística en viu. Un any més, la Fundació TMB col·labora amb el festival Dansa Metropolitana per traslladar l’emoció de la dansa al suburbà. Concretament, al vestíbul inferior de l’estació Universitat L1.
A l'espectacle (Un attimo), de la companyia Paloma Muñoz - Siberia Danza, els ballarins es mouen al so de la música de Mozart i creen una atmosfera que transforma l’espai a través d’un joc simple de llums i reflexos. La proposta explora la interacció dels cossos en moviment i l’entorn arquitectònic i ens convida a fer pausa de la rutina i contemplar la bellesa en un espai habitualment associat a l’estrès i la pressa. Un projecte que busca transformar la quotidianitat del metro en una experiència artística i emocional que connecti els usuaris amb un instant de contemplació.
Dansa a tots els municipis, fins al 30 de març
Del 13 al 30 de març, Dansa Metropolitana programarà funcions de dansa en diferents espais de 12 municipis de l’àrea metropolitana de Barcelona: Badalona, Barcelona, Cornellà, Granollers, l’Hospitalet, Esplugues, el Prat, Santa Coloma, Sabadell, Sant Cugat, Terrassa i Viladecans.
Enguany, el festival posa l'accent en la connexió íntima entre el so i el moviment i explora com la vibració crea diàlegs únics entre cos i música. Aquesta interacció esdevé un llenguatge artístic que transcendeix disciplines i suscita emocions compartides. Perquè la dansa no només es veu, es viu, i és en aquest moviment compartit on trobem la vibració que ens uneix.
També et poden interessar
-
FinalitzatExposició
Exposició La petita història del metro
Un viatge de cent anys d'història en dibuixos.Quan: Des de 10/01/2025 a 19/03/2025On: Espai Mercè Sala - Fundació TMB -
FinalitzatCampanya
Quan viatgis en bus, fes-ho fàcil
El teu trajecte serà més àgil i pràctic, i també facilitaràs la feina al conductor. -
FinalitzatCampanya
Sempre hi som
El metro i els busos tenen càmeres de videovigilància en temps real perquè viatgis amb seguretat.

Et trobes a:
Zurich Marató de Barcelona
T'expliquem com arribar-hi!
Quan: 16.03.2025
On: Des del passeig de Gràcia
Si participes a la Marató Barcelona, arriba-hi amb transport públic. A TMB t'hi portem.
Recomanem accedir al punt de sortida amb metro a les estacions Catalunya (L1 i L3) i Passeig de Gràcia (L2, L3 i L4). També tens l'opció d'arribar-hi en FGC.
Consulta les afectacions al servei de bus i les recomanacions de transport a l'avís de servei específic.
Disposes de Vull anar per trobar altres opcions de transport.
Fins a primera hora de la tarda de diumenge 16 de març, aconsellem fer servir el metro com a mitjà de transport principal. L'amplitud del recorregut de la Marató i la durada de la cursa comportarà alteracions en el servei d'una seixantena de línies de bus.

Bitllet de transport exclusiu
Per a aquesta edició, s'han editat 25.000 bitllets senzills, que s'inclouen a la bossa dels corredors fins a esgotar-ne les existències.
TMB, amb els grans esdeveniments de la ciutat
La Zurich Marató Barcelona, amb 27.000 participants, és una de les curses més importants que se celebren anualment a la ciutat.
TMB, com a principal operador de transport públic de Barcelona i la seva àrea metropolitana, treballa en l'impacte que una celebració d'aquesta magnitud pot tenir a la xarxa de transport. A més a més, també s'implica de forma activa amb els esdeveniments, sent-hi present de forma latent i col·laborant-hi a nivell logístic i de marca.
Ves-hi amb TMB App!
Dissenya la teva ruta, configura les alertes dels transports que necessitis i arriba a la cursa sense sorpreses!
-
FinalitzatCampanya
Quan viatgis en metro, fes-ho de manera segura
Nosaltres vetllem per la teva seguretat, tu evites accions que posen en perill la teva integritat i el bon funcionament del servei. -
FinalitzatCampanya
Posa't a la seva pell, no al seu lloc
Respecta la prioritat absoluta al transport públic. -
FinalitzatCampanya
Sempre hi som
El metro i els busos tenen càmeres de videovigilància en temps real perquè viatgis amb seguretat.

Et trobes a:
Proves d’aptitud per als músics del metro
Nova edició de les proves de selecció per als músics aspirants a tocar als punts habilitats de la xarxa de metro.
Quan: 14.03.2025
On: Estació Universitat L2
Accés: Entrada gratuïta*
El 14 de març tindrà lloc una nova edició de les proves de selecció per als músics aspirants a tocar als punts habilitats de la xarxa de metro. Transports Metropolitans de Barcelona (TMB) i l’AMUC BCN (Associació de músics i músiques del carrer i del metro de Barcelona) són els organitzadors d'aquesta convocatòria, que es durà terme al vestíbul de l'estació Universitat L2, de 8 a 20 hores.
La prova d’idoneïtat consisteix en què cada candidat haurà d’interpretar un parell de fragments de temes del seu repertori, amb una durada màxima entre tres i cinc minuts. Un jurat, format per professors de música professionals, auditarà la prova i valorarà criteris com la qualitat interpretativa, la varietat de repertori, l’originalitat i la riquesa creativa de la proposta i la diversitat cultural, estilística i instrumental.
Si l’avaluació del jurat és favorable, el músic obtindrà el carnet d’associat a AMUC BCN i podrà participar en els projectes d’aquesta associació, incloent-hi les actuacions al metro.
Amb la col·laboració de
També et poden interessar
-
FinalitzatArts escèniques
Dansa Metropolitana al metro
Transformem la quotidianitat del metro en una experiència artística i emocional que connecti els usuaris amb un instant de contemplació.Quan: Des de 15/03/2025On: Estació Universitat L1 -
FinalitzatExposició
Exposició La petita història del metro
Un viatge de cent anys d'història en dibuixos.Quan: Des de 10/01/2025 a 19/03/2025On: Espai Mercè Sala - Fundació TMB -
FinalitzatCampanya
Quan viatgis en bus, fes-ho fàcil
El teu trajecte serà més àgil i pràctic, i també facilitaràs la feina al conductor.
The following has evaluated to null or missing: ==> detallAgenda.elementsDetallAgenda.getSiblings()[0].titleDetallAgenda [in template "20155#20195#1501272" at line 308, column 85] ---- Tip: It's the step after the last dot that caused this error, not those before it. ---- Tip: If the failing expression is known to legally refer to something that's sometimes null or missing, either specify a default value like myOptionalVar!myDefault, or use <#if myOptionalVar??>when-present<#else>when-missing</#if>. (These only cover the last step of the expression; to cover the whole expression, use parenthesis: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)?? ---- ---- FTL stack trace ("~" means nesting-related): - Failed at: #if detallAgenda?? && 0 < detallAgend... [in template "20155#20195#1501272" at line 308, column 1] ----
1<#assign imagesFolder = themeDisplay.getPathThemeImages()>
2<#assign assetEntryLocalService = serviceLocator.findService("com.liferay.asset.kernel.service.AssetEntryLocalService")>
3<#assign currentURL = request.getRequestURL() />
4<#assign isFundacio = false>
5<#if currentURL?contains("fundacio")>
6 <#assign isFundacio = true>
7</#if>
8
9<#function miliSeconds dateString firstDate>
10 <#assign params = dateString?split(":")>
11
12 <#if params?size == 2>
13 <#assign param1 = params[0]>
14 <#assign param2 = params[1]>
15 <#assign param1 = getterUtil.getLong(param1)*3600000>
16 <#assign param2 = getterUtil.getLong(param2)*60000>
17 <#assign finalMilSec = param1 + param2>
18 <#assign finalMilSecLong = getterUtil.getLong(finalMilSec)>
19 <#assign resultLong = firstDate + finalMilSecLong>
20
21 <#return resultLong>
22 </#if>
23</#function>
24
25<#-- header-image -->
26
27<#if upperImage?? && upperImage.getData()?has_content>
28 <div class="header-image">
29 <img src="${upperImage.getData()}" <#if upperImageAlt?? && upperImageAlt.getData()?has_content>alt="${upperImageAlt.getData()}"</#if>>
30 </div>
31</#if>
32
33
34<#-- breadcrumbs -->
35
36<div class="full-body__container breadcrumbs" style="float: unset; margin-right: auto; padding-bottom: 22px; padding-top: 22px;">
37 <p class="breadcrumbs__title"><@liferay.language key='header.breadcrumbs.text' />:</p>
38 <#if liferay_portlet?has_content><@liferay.breadcrumbs /></#if>
39</div>
40
41
42<#-- TITOL I SUBTITOL -->
43
44<#if titleGlobal?? && titleGlobal.getData()?has_content || subtitleGlobal?? && subtitleGlobal.getData()?has_content>
45 <div class="full-body__container basicav2-titol-subtitol">
46 <#if titleGlobal?? && titleGlobal.getData()?has_content><h1>${titleGlobal.getData()}</h1></#if>
47 <#if subtitleGlobal?? && subtitleGlobal.getData()?has_content><p>${subtitleGlobal.getData()}</p></#if>
48 </div>
49</#if>
50
51
52<#-- bloc-info-agenda -->
53
54<#if blocInfoAgenda?? && ((blocInfoAgenda.whenBlocInfoAgenda.initDateBlocInfoAgenda?? && blocInfoAgenda.whenBlocInfoAgenda.initDateBlocInfoAgenda.getData()?has_content) || (blocInfoAgenda.whereBlocInfoAgenda.textWhereBlocInfoAgenda?? && blocInfoAgenda.whereBlocInfoAgenda.textWhereBlocInfoAgenda.getData()?has_content) || (blocInfoAgenda.accesBlocInfoAgenda.textAccesBlocInfoAgenda?? && blocInfoAgenda.accesBlocInfoAgenda.textAccesBlocInfoAgenda.getData()?has_content)) && (!blocInfoAgenda.hideBlocInfoAgenda?? || !getterUtil.getBoolean(blocInfoAgenda.hideBlocInfoAgenda.getData()))>
55 <div class="full-body__container bloc-info-agenda">
56 <div class="bloc-info-agenda-elements">
57 <#if blocInfoAgenda.whenBlocInfoAgenda.initDateBlocInfoAgenda?? && blocInfoAgenda.whenBlocInfoAgenda.initDateBlocInfoAgenda.getData()?has_content>
58 <div class="bloc-info-agenda-element">
59 <#if blocInfoAgenda.whenBlocInfoAgenda.imageWhenBlocInfoAgenda?? && blocInfoAgenda.whenBlocInfoAgenda.imageWhenBlocInfoAgenda.getData()?has_content>
60 <img class="bloc-info-agenda-img" src="${blocInfoAgenda.whenBlocInfoAgenda.imageWhenBlocInfoAgenda.getData()}">
61 <#else>
62 <img class="bloc-info-agenda-img" src="${imagesFolder}/basic/24px/svg/calendar.svg">
63 </#if>
64 <#if blocInfoAgenda.whenBlocInfoAgenda.fromInitDateBlocInfoAgenda?? && blocInfoAgenda.whenBlocInfoAgenda.fromInitDateBlocInfoAgenda.getData()?has_content && getterUtil.getBoolean(blocInfoAgenda.whenBlocInfoAgenda.fromInitDateBlocInfoAgenda.getData())>
65 <div class="bloc-info-agenda-text"><p><@liferay.language key="label.bloc.novetatagenda.when"/> <b><@liferay.language key='label.bloc.novetatagenda.from' /> ${blocInfoAgenda.whenBlocInfoAgenda.initDateBlocInfoAgenda.getData()?date["yyyy-MM-dd"]?string("dd.MM.yyyy")}</b></p></div>
66 <#else>
67 <div class="bloc-info-agenda-text"><p><@liferay.language key="label.bloc.novetatagenda.when"/> <b>${blocInfoAgenda.whenBlocInfoAgenda.initDateBlocInfoAgenda.getData()?date["yyyy-MM-dd"]?string("dd.MM.yyyy")}<#if blocInfoAgenda.whenBlocInfoAgenda.endDateBlocInfoAgenda?? && blocInfoAgenda.whenBlocInfoAgenda.endDateBlocInfoAgenda.getData()?has_content> <@liferay.language key="label.bloc.novetatagenda.to"/> ${blocInfoAgenda.whenBlocInfoAgenda.endDateBlocInfoAgenda.getData()?date["yyyy-MM-dd"]?string("dd.MM.yyyy")}</#if></b></p></div>
68 </#if>
69 </div>
70 <hr>
71 </#if>
72 <#if blocInfoAgenda.whereBlocInfoAgenda.textWhereBlocInfoAgenda?? && blocInfoAgenda.whereBlocInfoAgenda.textWhereBlocInfoAgenda.getData()?has_content>
73 <div class="bloc-info-agenda-element">
74 <#if blocInfoAgenda.whereBlocInfoAgenda.imageWhereBlocInfoAgenda?? && blocInfoAgenda.whereBlocInfoAgenda.imageWhereBlocInfoAgenda.getData()?has_content>
75 <img class="bloc-info-agenda-img" src="${blocInfoAgenda.whereBlocInfoAgenda.imageWhereBlocInfoAgenda.getData()}">
76 <#else>
77 <img class="bloc-info-agenda-img" src="${imagesFolder}/basic/24px/svg/location_on.svg">
78 </#if>
79 <div class="bloc-info-agenda-text"><p><@liferay.language key="label.bloc.novetatagenda.where"/> <b>${blocInfoAgenda.whereBlocInfoAgenda.textWhereBlocInfoAgenda.getData()}</b></p></div>
80 </div>
81 <hr>
82 </#if>
83 <#if blocInfoAgenda.accesBlocInfoAgenda.textAccesBlocInfoAgenda?? && blocInfoAgenda.accesBlocInfoAgenda.textAccesBlocInfoAgenda.getData()?has_content>
84 <div class="bloc-info-agenda-element">
85 <#if blocInfoAgenda.accesBlocInfoAgenda.imageAccesBlocInfoAgenda?? && blocInfoAgenda.accesBlocInfoAgenda.imageAccesBlocInfoAgenda.getData()?has_content>
86 <img class="bloc-info-agenda-img" src="${blocInfoAgenda.accesBlocInfoAgenda.imageAccesBlocInfoAgenda.getData()}">
87 <#else>
88 <img class="bloc-info-agenda-img" src="${imagesFolder}/basic/24px/svg/ticket.svg">
89 </#if>
90 <div class="bloc-info-agenda-text"><p><@liferay.language key="label.bloc.novetatagenda.acces"/> <b>${blocInfoAgenda.accesBlocInfoAgenda.textAccesBlocInfoAgenda.getData()}</b></p></div>
91 </div>
92 </#if>
93 </div>
94 <#if blocInfoAgenda.textBottomBlocInfoAgenda?? && blocInfoAgenda.textBottomBlocInfoAgenda.getData()?has_content>
95 <div class="bloc-info-agenda-bottom">
96 <span>${blocInfoAgenda.textBottomBlocInfoAgenda.getData()}</span>
97 </div>
98 </#if>
99 </div>
100</#if>
101
102<#-- text-center -->
103
104<#if textCenter?? && textCenter.getData()?has_content>
105 <div class="full-body__container text-center-basic">
106 ${textCenter.getData()}
107 </div>
108</#if>
109
110
111<#-- image-center -->
112
113<#if imageCenter?? && imageCenter.getData()?has_content>
114 <div class="full-body__container image-center-basic">
115 <img src="${imageCenter.getData()}">
116 </div>
117</#if>
118
119
120<#-- TEXT-CARRUSEL-IMATGES -->
121
122<#if textCarruselImatges1?? && 0 < textCarruselImatges1.elementsFieldSet.getSiblings()?size && textCarruselImatges1.elementsFieldSet.getSiblings()[0].elementsFieldSetFieldSet.image?? && textCarruselImatges1.elementsFieldSet.getSiblings()[0].elementsFieldSetFieldSet.image.getData()?has_content && (!textCarruselImatges1.hideTextCarruselImatges?? || !getterUtil.getBoolean(textCarruselImatges1.hideTextCarruselImatges.getData()))>
123 <#assign entriesMapList = []>
124 <#foreach elem in textCarruselImatges1.elementsFieldSet.getSiblings()>
125 <#if elem.elementsFieldSetFieldSet.order?has_content>
126 <#assign currentOrder = elem.elementsFieldSetFieldSet.order.getData()>
127 </#if>
128 <#if !currentOrder?has_content || currentOrder == "null">
129 <#assign currentOrder = "99">
130 </#if>
131 <#assign currEntryMap = {"entry" : elem.elementsFieldSetFieldSet , "order" : currentOrder?number}>
132 <#assign entriesMapList = entriesMapList + [currEntryMap]>
133 </#foreach>
134
135 <#assign sortedEntriesMapList = entriesMapList?sort_by("order")>
136 <#assign sortedEntriesRootElems = []>
137
138 <#foreach currEntryMap in sortedEntriesMapList>
139 <#assign sortedEntriesRootElems = sortedEntriesRootElems + [currEntryMap.entry]>
140 </#foreach>
141
142 <#assign leftContent = "">
143 <#if textCarruselImatges1.titleHeader?? && textCarruselImatges1.titleHeader.getData()?has_content && textCarruselImatges1.descHeader?? && textCarruselImatges1.descHeader?has_content>
144 <#assign leftContent = "true">
145 </#if>
146
147 <div class="full-body__container hero-carousel-new hero-carousel hero-carousel--super hero-carousel-banner-alt <#if !leftContent?has_content>hero-carousel-banner-solo</#if>">
148 <#if leftContent?has_content>
149 <div class="hero-carousel__container-banner">
150 <h2 class="hero-carousel-banner-alt-title">
151 ${textCarruselImatges1.titleHeader.getData()}
152 </h2>
153 <p class="hero-carousel-banner-alt-desc">
154 ${textCarruselImatges1.descHeader.getData()}
155 </p>
156 </div>
157 </#if>
158 <div aria-live="polite" aria-atomic="false" aria-relevant="all" class="slick-list draggable">
159 <div class="hero-carousel__container js-carousel-banner-al_1 is-playing"
160 data-prev-text='<@liferay.language key="label.carousel.prev"/>'
161 data-next-text='<@liferay.language key="label.carousel.next"/>'
162 data-pagination-text='<@liferay.language key="label.carousel.outstanding"/>'
163 data-stop-text='<@liferay.language key="label.carousel.pause"/>'
164 data-play-text='<@liferay.language key="label.carousel.start"/>'>
165 <#if sortedEntriesRootElems?has_content>
166 <#foreach element in sortedEntriesRootElems>
167 <div class="hero hero--super">
168 <div class="hero__container">
169 <#if element.typeLink.getData() == "video">
170 <a href="#" onclick='showVideoModalBanner(`${element.External_Link.getData()}`);return false;' class="hero__link" <#if element.titleLink?? && element.titleLink.getData()?has_content>title="${element.titleLink.getData()}"</#if>>
171 <#else>
172 <a class="hero__link" <#if element.titleLink?? && element.titleLink.getData()?has_content>title="${element.titleLink.getData()}"</#if> <#if element.typeLink.getData() == "extern"> href="${element.External_Link.getData()}" target="_blank" <#elseif element.typeLink.getData() == "intern" && element.Internal_Link?? && element.Internal_Link.getFriendlyUrl()?has_content> href="${element.Internal_Link.getFriendlyUrl()}" target="_self" <#elseif element.typeLink.getData() == "intern" && element.External_Link?? && element.External_Link.getData()?has_content> href="${element.External_Link.getData()}" target="_self" </#if>>
173 </#if>
174 <div class="hero__media <#if (!element.titleElem?? || !element.titleElem.getData()?has_content) && (!element.descElem?? || !element.descElem.getData()?has_content)>hero__media-no-fade</#if>">
175 <#if element.typeLink.getData() == "video">
176 <div class="hero__media-video__container">
177 <span class="hero__media-video__img">
178 </span>
179 </div>
180 </#if>
181 <img class="hero__image hero__image-new lazyload" data-src="${element.image.getData()}" <#if element.altImage?? && element.altImage.getData()?has_content>alt="${element.altImage.getData()}"</#if>>
182 </div>
183 <div class="hero__content white__banner">
184 <p class="hero__title" >
185 ${element.titleElem.getData()}
186 <#if element.typeLink.getData() == "extern">
187 <span class="window-warning">
188 <img class="window-warning__icon" src="${imagesFolder}/basic/16px/png/icone-obrir-fora-blanc-16x16.png" alt="<@liferay.language key="label.externalLink.alt"/>" title="<@liferay.language key="label.externalLink.title"/>">
189 </span>
190 </#if>
191 </p>
192 <p class="hero__desc-alt" >
193 ${element.descElem.getData()}
194 </p>
195 </div>
196 </a>
197 </div>
198 </div>
199 </#foreach>
200 </#if>
201 </div>
202 </div>
203 </div>
204
205 <div class="dialog">
206 <div id="carrusel-banner-video" class="u-hidden">
207 <div class="dialog__body dialog__body--jotmbe" id="carrusel-banner-video-content">
208 </div>
209 </div>
210 </div>
211 <script type="text/javascript">
212 initSliderCarruselBanner1();
213
214 function initSliderCarruselBanner1() {
215 if($(".js-carousel-banner-al_1").hasClass('slick-initialized')) {
216 $(".js-carousel-banner-al_1").slick("unslick");
217 }
218 $('.js-carousel-banner-al_1 .slick-toggle-play').remove();
219 $('.js-carousel-banner-al_1').slick({
220 slidesToShow: 1,
221 arrows: true,
222 draggable: true,
223 infinite: false,
224 variableWidth: false,
225 autoplaySpeed: 4000,
226 dots: true,
227 nextArrow: '<button type="button" class="slick-next"><img class="slick-next__icon slick-next__icon-normal" src="${imagesFolder}/basic/18px/svg/arrow-next-black.svg" alt=\'<@liferay.language key="label.next"/>\'/><img class="slick-next__icon slick-next__icon-disabled" src="${imagesFolder}/basic/18px/svg/arrow-next-gray.svg" alt=\'<@liferay.language key="label.next"/>\'/></button>',
228 prevArrow: '<button type="button" class="slick-prev"><img class="slick-prev__icon slick-prev__icon-normal" src="${imagesFolder}/basic/18px/svg/arrow-prev-black.svg" alt=\'<@liferay.language key="label.prev"/>\'/><img class="slick-prev__icon slick-prev__icon-disabled" src="${imagesFolder}/basic/18px/svg/arrow-prev-gray.svg" alt=\'<@liferay.language key="label.prev"/>\'/></button>',
229 responsive: [
230 {
231 breakpoint: 767,
232 settings: {
233 slidesToShow: 1,
234 arrows: false,
235 variableWidth: true,
236 dots: true
237 }
238 }
239 ]
240 }).each(function () {
241 var carousel = $(this),
242 toggleButton,
243 toggleIcon;
244
245 carousel.find('.slick-next__icon').attr({
246 'alt': carousel.data('next-text')
247 });
248
249 carousel.find('.slick-prev__icon').attr({
250 'alt': carousel.data('prev-text')
251 });
252 });
253
254 if ($('.hero-carousel__container .hero').length == 1) {
255 $('.hero-carousel__container .slick-toggle-play').hide();
256 }
257
258 $('.slick-cloned[aria-describedby]').removeAttr('aria-describedby');
259 if($(".js-carousel-banner-al_1 .slick-dots").length > 0) {
260 setDotsPositionBanner1();
261 }
262 }
263
264 function showVideoModalBanner(link) {
265 const start = link.indexOf("v=") + 2;
266 const end = start + 2 + 11;
267
268 TMB.dialog.newModal(langJotmbeClose, "dialog--jotmbe__no-footer dialog--jotmbe__no-icon dialog--jotmbe__with-actions dialog-video-iframe", "carrusel-banner-video", "");
269 $('#carrusel-banner-video-content').html('<iframe class="home-carrusel-video-iframe" src="https://www.youtube.com/embed/'+link.substring(start, end)+'" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>');
270 }
271 function setDotsPositionBanner1() {
272 $(".js-carousel-banner-al_1 .slick-dots").appendTo($(".js-carousel-banner-al_1").parent());
273 }
274
275 window.addEventListener('resize', function(event){
276 const width = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth;
277 if($(".js-carousel-banner-al_1 .slick-dots").length > 0 && width > 768) {
278 setDotsPositionBanner1();
279 }
280 });
281
282 </script>
283</#if>
284
285
286<#-- BASICA-TITOL-TEXT -->
287
288<#if basicaTitolText?? && 0 < basicaTitolText.elementsBasica.getSiblings()?size && (basicaTitolText.elementsBasica.getSiblings()[0].titleBasica.getData()?has_content || basicaTitolText.elementsBasica.getSiblings()[0].contentBasica.getData()?has_content) && (!basicaTitolText.hideBasicaTitolText?? || !getterUtil.getBoolean(basicaTitolText.hideBasicaTitolText.getData()))>
289 <div class="full-body__container basica-titol-text">
290 <#foreach elem in basicaTitolText.elementsBasica.getSiblings()>
291 <div class="basica-titol-text-wrapper">
292 <#if elem.titleBasica?? && elem.titleBasica.getData()?has_content><h2 class="">${elem.titleBasica.getData()}</h2></#if>
293 <#if elem.contentBasica?? && elem.contentBasica.getData()?has_content><div class="basica-titol-text-content">${elem.contentBasica.getData()}</div></#if>
294 </div>
295 <#foreach subelem in elem.subelementsBasica.getSiblings()>
296 <div class="basica-titol-text-wrapper">
297 <#if subelem.subelementTitleBasica?? && subelem.subelementTitleBasica.getData()?has_content><h3>${subelem.subelementTitleBasica.getData()}</h3></#if>
298 <#if subelem.subelementContentBasica?? && subelem.subelementContentBasica.getData()?has_content><div class="basica-titol-text-content">${subelem.subelementContentBasica.getData()}</div></#if>
299 </div>
300 </#foreach>
301 </#foreach>
302 </div>
303</#if>
304
305
306<#-- bloc-detall-agenda -->
307
308<#if detallAgenda?? && 0 < detallAgenda.elementsDetallAgenda.getSiblings()?size && (detallAgenda.elementsDetallAgenda.getSiblings()[0].titleDetallAgenda.getData()?has_content || detallAgenda.elementsDetallAgenda.getSiblings()[0].contentDetallAgenda.getData()?has_content) && (!detallAgenda.hideDetallAgenda?? || !getterUtil.getBoolean(detallAgenda.hideDetallAgenda.getData()))>
309 <div class="full-body__container detall-agenda">
310 <#foreach elem in detallAgenda.elementsDetallAgenda.getSiblings()>
311 <div class="detall-agenda-wrapper">
312 <#if elem.titleDetallAgenda?? && elem.titleDetallAgenda.getData()?has_content><h2 class="">${elem.titleDetallAgenda.getData()}</h2></#if>
313 <#if elem.contentDetallAgenda?? && elem.contentDetallAgenda.getData()?has_content><div class="detall-agenda-content">${elem.contentDetallAgenda.getData()}</div></#if>
314 </div>
315 </#foreach>
316 <div class="detall-agenda-buttons-wrapper">
317 <#foreach subelem in detallAgenda.buttonsDetallAgenda.getSiblings()>
318 <a title="<#if subelem.accessibleTitleButtons?? && subelem.accessibleTitleButtons.getData()?has_content>${subelem.accessibleTitleButtons.getData()}</#if>" type="button" class="button button--a" <#if subelem.linkTypeDetallAgenda.getData() == "extern" && subelem.External_LinkDetallAgenda?? && subelem.External_LinkDetallAgenda.getData()?has_content> href="${subelem.External_LinkDetallAgenda.getData()}" rel="external" target="_blank" <#elseif subelem.linkTypeDetallAgenda.getData() == "intern" && subelem.Internal_LinkDetallAgenda?? && subelem.Internal_LinkDetallAgenda.getFriendlyUrl()?has_content> href="${subelem.Internal_LinkDetallAgenda.getFriendlyUrl()}" target="_self" <#elseif subelem.linkTypeDetallAgenda.getData() == "intern" && subelem.External_LinkDetallAgenda?? && subelem.External_LinkDetallAgenda.getData()?has_content> href="${subelem.External_LinkDetallAgenda.getData()}" target="_self" </#if>>
319 <span class="button__label">${subelem.linkTextDetallAgenda.getData()}</span>
320 </a>
321 </#foreach>
322 </div>
323 </div>
324</#if>
325
326
327<#-- DT_PP_TITULO_VIDEO -->
328
329<#if stPpVideo?? && stPpVideo.linkFieldSet.link.getData()?has_content && (!stPpVideo.hideStPpVideo?? || !getterUtil.getBoolean(stPpVideo.hideStPpVideo.getData()))>
330 <style>
331 .points-video__video-cover.no_video::after{
332 background: none;
333 }
334 </style>
335 <#assign hasLink = false>
336 <#if stPpVideo.linkHeader?? && stPpVideo.linkHeader.getData()?has_content && stPpVideo.linkHeaderText?? && stPpVideo.linkHeaderText.getData()?has_content>
337 <#assign hasLink = true>
338 </#if>
339 <section class="points-video bg-gray pt-56">
340 <div class="main__container">
341 <div class="full-body">
342 <div class="full-body__container points-video__header-extra-container">
343 <#if stPpVideo.linkFieldSet.linkFieldSetFieldSet.ancoraVideo.getData()?has_content && stPpVideo.linkFieldSet.linkFieldSetFieldSet.ancoraVideo.getData()?trim?has_content>
344 <a name="${stPpVideo.linkFieldSet.linkFieldSetFieldSet.ancoraVideo.getData()}" id="${stPpVideo.linkFieldSet.linkFieldSetFieldSet.ancoraVideo.getData()}">
345 </a>
346 </#if>
347 <#if stPpVideo.titol?? && stPpVideo.titol.getData()?has_content>
348 <div class="points-video__header">
349 <div class="points-video__header-extra" <#if !hasLink>style="justify-content: center; margin-right: 0;"</#if>>
350 <h2 class="points-video__title">
351 ${stPpVideo.titol.getData()}</h2>
352 <#if hasLink>
353 <a class="points-video__subtitle-link" href="${stPpVideo.linkHeader.getData()}">${stPpVideo.linkHeaderText.getData()}</a>
354 </#if>
355 </div>
356 <p class="points-video__description" <#if !hasLink>style="text-align: center; max-width: 100%;"</#if>>
357 ${stPpVideo.descriptiu.getData()}</p>
358 </div>
359 </#if>
360
361 <div class="points-video__video-item cookieconsent-optin-marketing media-unit__content" id="marketingCookies">
362 <#if stPpVideo.linkFieldSet.link.getData()?has_content>
363 <#assign start = stPpVideo.linkFieldSet.link.getData()?index_of("v=") + 2>
364 <#--13 because v= + 11 char for youtube ids
365 -->
366 <#assign end = start + 11>
367 <a href="${stPpVideo.linkFieldSet.link.getData()}" class="points-video__video-stPpVideo.linkFieldSet.link" title="${stPpVideo.linkFieldSet.linkFieldSetFieldSet.descriptiuVideo.getData()}"
368 rel="dialog-video" data-video="${stPpVideo.linkFieldSet.link.getData()?substring(start, end)}">
369 <div class="points-video__video-cover" style="background-image: url(${stPpVideo.linkFieldSet.linkFieldSetFieldSet.imgVideoFieldSet.imgVideo.getData()});">
370 <img src="${stPpVideo.linkFieldSet.linkFieldSetFieldSet.imgVideoFieldSet.imgVideo.getData()}" alt="${stPpVideo.linkFieldSet.linkFieldSetFieldSet.imgVideoFieldSet.imgVideoFieldSetFieldSet.alt.getData()}" class="points-video__video-image">
371 </div>
372 <#if stPpVideo.linkFieldSet.linkFieldSetFieldSet.descriptiuVideo.getData()?has_content>
373 <p class="points-video__caption">
374 ${stPpVideo.linkFieldSet.linkFieldSetFieldSet.descriptiuVideo.getData()}</p>
375 </#if>
376 </a>
377 <#else>
378 <a class="points-video__video-link" title="${stPpVideo.linkFieldSet.linkFieldSetFieldSet.descriptiuVideo.getData()}">
379 <div class="points-video__video-cover no_video" style="background-image: url(${stPpVideo.linkFieldSet.linkFieldSetFieldSet.imgVideoFieldSet.imgVideo.getData()});">
380 <img src="${stPpVideo.linkFieldSet.linkFieldSetFieldSet.imgVideoFieldSet.imgVideo.getData()}" alt="${stPpVideo.linkFieldSet.linkFieldSetFieldSet.imgVideoFieldSet.imgVideoFieldSetFieldSet.alt.getData()}" class="points-video__video-image">
381 </div>
382 <#if stPpVideo.linkFieldSet.linkFieldSetFieldSet.descriptiuVideo.getData()?has_content>
383 <p class="points-video__caption">
384 ${stPpVideo.linkFieldSet.linkFieldSetFieldSet.descriptiuVideo.getData()}</p>
385 </#if>
386 </a>
387
388 </#if>
389 </div>
390 <div class='cookieconsent-optout-marketing media-unit__content'>
391 <@liferay.language key="cookiebot.youtube.no-marketing"/>
392 </div>
393 <#if hasLink>
394 <a class="points-video__subtitle-link-mobile" href="${stPpVideo.linkHeader.getData()}">${stPpVideo.linkHeaderText.getData()}</a>
395 </#if>
396 </div>
397 </div>
398 </div>
399 </section>
400 <section class="video-dialog js__video-dialog u-hidden">
401 <div class="u-hidden" id="fragment-show-video">
402 <div class="video-dialog__panel">
403 <header class="video-dialog__header">
404 <button class="video-dialog__close js__video-dialog-close">
405 Cerrar</button>
406 </header>
407 <div class="video-dialog__content">
408 <div class="video-dialog__inner js__video-dialog-container">
409 <iframe data-cookieconsent="marketing" data-cookieblock-src="https://www.youtube.com/embed/${stPpVideo.linkFieldSet.link.getData()?substring(start, end)}" frameborder="0" class="video-dialog__media" allow="encrypted-media" allowfullscreen="">
410 </iframe>
411 </div>
412 </div>
413 </div>
414 </div>
415 <div class="video-dialog__overlay js__video-dialog-close">
416 </div>
417 </section>
418</#if>
419
420
421<#-- TEXT-CARRUSEL-IMATGES-ALT -->
422
423<#if textCarruselImatges2?? && 0 < textCarruselImatges2.elementsFieldSetAlt.getSiblings()?size && textCarruselImatges2.elementsFieldSetAlt.getSiblings()[0].elementsFieldSetFieldSetAlt.imageAlt?? && textCarruselImatges2.elementsFieldSetAlt.getSiblings()[0].elementsFieldSetFieldSetAlt.imageAlt.getData()?has_content && (!textCarruselImatges2.hideTextCarruselImatgesAlt?? || !getterUtil.getBoolean(textCarruselImatges2.hideTextCarruselImatgesAlt.getData()))>
424 <#assign imagesFolder = themeDisplay.getPathThemeImages()>
425
426 <#assign entriesMapList = []>
427 <#foreach elem in textCarruselImatges2.elementsFieldSetAlt.getSiblings()>
428 <#if elem.elementsFieldSetFieldSetAlt.order?has_content>
429 <#assign currentOrder = elem.elementsFieldSetFieldSetAlt.order.getData()>
430 </#if>
431 <#if !currentOrder?has_content || currentOrder == "null">
432 <#assign currentOrder = "99">
433 </#if>
434 <#assign currEntryMap = {"entry" : elem.elementsFieldSetFieldSetAlt , "order" : currentOrder?number}>
435 <#assign entriesMapList = entriesMapList + [currEntryMap]>
436 </#foreach>
437
438 <#assign sortedEntriesMapList = entriesMapList?sort_by("order")>
439 <#assign sortedEntriesRootElems = []>
440
441 <#foreach currEntryMap in sortedEntriesMapList>
442 <#assign sortedEntriesRootElems = sortedEntriesRootElems + [currEntryMap.entry]>
443 </#foreach>
444
445 <#assign leftContent = "">
446 <#if textCarruselImatges2.titleHeaderAlt?? && textCarruselImatges2.titleHeaderAlt.getData()?has_content && textCarruselImatges2.descHeaderAlt?? && textCarruselImatges2.descHeaderAlt?has_content>
447 <#assign leftContent = "true">
448 </#if>
449
450 <div class="full-body__container hero-carousel-new hero-carousel hero-carousel--super hero-carousel-banner-alt <#if !leftContent?has_content>hero-carousel-banner-solo</#if>">
451 <#if leftContent?has_content>
452 <div class="hero-carousel__container-banner">
453 <h2 class="hero-carousel-banner-alt-title">
454 ${textCarruselImatges2.titleHeaderAlt.getData()}
455 </h2>
456 <p class="hero-carousel-banner-alt-desc">
457 ${textCarruselImatges2.descHeaderAlt.getData()}
458 </p>
459 </div>
460 </#if>
461 <div aria-live="polite" aria-atomic="false" aria-relevant="all" class="slick-list draggable">
462 <div class="hero-carousel__container js-carousel-banner-al_alt is-playing"
463 data-prev-text='<@liferay.language key="label.carousel.prev"/>'
464 data-next-text='<@liferay.language key="label.carousel.next"/>'
465 data-pagination-text='<@liferay.language key="label.carousel.outstanding"/>'
466 data-stop-text='<@liferay.language key="label.carousel.pause"/>'
467 data-play-text='<@liferay.language key="label.carousel.start"/>'>
468 <#if sortedEntriesRootElems?has_content>
469 <#foreach element in sortedEntriesRootElems>
470 <div class="hero hero--super">
471 <div class="hero__container">
472 <#if element.typeLinkAlt.getData() == "video">
473 <a href="#" onclick='showVideoModalBanner(`${element.External_LinkAlt.getData()}`);return false;' class="hero__link" <#if element.titleLinkAlt?? && element.titleLinkAlt.getData()?has_content>title="${element.titleLinkAlt.getData()}"</#if>>
474 <#else>
475 <a class="hero__link" <#if element.titleLinkAlt?? && element.titleLinkAlt.getData()?has_content>title="${element.titleLinkAlt.getData()}"</#if> <#if element.typeLinkAlt.getData() == "extern"> href="${element.External_LinkAlt.getData()}" target="_blank" <#elseif element.typeLinkAlt.getData() == "intern" && element.Internal_Link?? && element.Internal_Link.getFriendlyUrl()?has_content> href="${element.Internal_Link.getFriendlyUrl()}" target="_self" <#elseif element.typeLinkAlt.getData() == "intern" && element.External_LinkAlt?? && element.External_LinkAlt.getData()?has_content> href="${element.External_LinkAlt.getData()}" target="_self" </#if>>
476 </#if>
477 <div class="hero__media <#if (!element.titleElemAlt?? || !element.titleElemAlt.getData()?has_content) && (!element.descElemAlt?? || !element.descElemAlt.getData()?has_content)>hero__media-no-fade</#if>">
478 <#if element.typeLinkAlt.getData() == "video">
479 <div class="hero__media-video__container">
480 <span class="hero__media-video__img">
481 </span>
482 </div>
483 </#if>
484 <img class="hero__image hero__image-new lazyload" data-src="${element.imageAlt.getData()}" <#if element.altImage?? && element.altImage.getData()?has_content>alt="${element.altImage.getData()}"</#if>>
485 </div>
486 <div class="hero__content white__banner">
487 <p class="hero__title" >
488 ${element.titleElemAlt.getData()}
489 <#if element.typeLinkAlt.getData() == "extern">
490 <span class="window-warning">
491 <img class="window-warning__icon" src="${imagesFolder}/basic/16px/png/icone-obrir-fora-blanc-16x16.png" alt="<@liferay.language key="label.externalLink.alt"/>" title="<@liferay.language key="label.externalLink.title"/>">
492 </span>
493 </#if>
494 </p>
495 <p class="hero__desc-alt" >
496 ${element.descElemAlt.getData()}
497 </p>
498 </div>
499 </a>
500 </div>
501 </div>
502 </#foreach>
503 </#if>
504 </div>
505 </div>
506 </div>
507
508 <div class="dialog">
509 <div id="carrusel-banner-video" class="u-hidden">
510 <div class="dialog__body dialog__body--jotmbe" id="carrusel-banner-video-content">
511 </div>
512 </div>
513 </div>
514 <script type="text/javascript">
515 initSliderCarruselBanner2();
516
517 function initSliderCarruselBanner2() {
518 if($(".js-carousel-banner-al_alt").hasClass('slick-initialized')) {
519 $(".js-carousel-banner-al_alt").slick("unslick");
520 }
521 $('.js-carousel-banner-al_alt .slick-toggle-play').remove();
522 $('.js-carousel-banner-al_alt').slick({
523 slidesToShow: 1,
524 arrows: true,
525 draggable: true,
526 infinite: false,
527 variableWidth: false,
528 autoplaySpeed: 4000,
529 dots: true,
530 nextArrow: '<button type="button" class="slick-next"><img class="slick-next__icon slick-next__icon-normal" src="${imagesFolder}/basic/18px/svg/arrow-next-black.svg" alt=\'<@liferay.language key="label.next"/>\'/><img class="slick-next__icon slick-next__icon-disabled" src="${imagesFolder}/basic/18px/svg/arrow-next-gray.svg" alt=\'<@liferay.language key="label.next"/>\'/></button>',
531 prevArrow: '<button type="button" class="slick-prev"><img class="slick-prev__icon slick-prev__icon-normal" src="${imagesFolder}/basic/18px/svg/arrow-prev-black.svg" alt=\'<@liferay.language key="label.prev"/>\'/><img class="slick-prev__icon slick-prev__icon-disabled" src="${imagesFolder}/basic/18px/svg/arrow-prev-gray.svg" alt=\'<@liferay.language key="label.prev"/>\'/></button>',
532 responsive: [
533 {
534 breakpoint: 767,
535 settings: {
536 slidesToShow: 1,
537 arrows: false,
538 variableWidth: true,
539 dots: true
540 }
541 }
542 ]
543 }).each(function () {
544 var carousel = $(this),
545 toggleButton,
546 toggleIcon;
547
548 carousel.find('.slick-next__icon').attr({
549 'alt': carousel.data('next-text')
550 });
551
552 carousel.find('.slick-prev__icon').attr({
553 'alt': carousel.data('prev-text')
554 });
555 });
556
557 if ($('.hero-carousel__container .hero').length == 1) {
558 $('.hero-carousel__container .slick-toggle-play').hide();
559 }
560
561 $('.slick-cloned[aria-describedby]').removeAttr('aria-describedby');
562 if($(".js-carousel-banner-al_alt .slick-dots").length > 0) {
563 setDotsPositionBanner2();
564 }
565 }
566
567 function showVideoModalBanner2(link) {
568 const start = link.indexOf("v=") + 2;
569 const end = start + 2 + 11;
570
571 TMB.dialog.newModal(langJotmbeClose, "dialog--jotmbe__no-footer dialog--jotmbe__no-icon dialog--jotmbe__with-actions dialog-video-iframe", "carrusel-banner-video", "");
572 $('#carrusel-banner-video-content').html('<iframe class="home-carrusel-video-iframe" src="https://www.youtube.com/embed/'+link.substring(start, end)+'" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>');
573 }
574 function setDotsPositionBanner2() {
575 $(".js-carousel-banner-al_alt .slick-dots").appendTo($(".js-carousel-banner-al_alt").parent());
576 }
577
578 window.addEventListener('resize', function(event){
579 const width = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth;
580 if($(".js-carousel-banner-al_alt .slick-dots").length > 0 && width > 768) {
581 setDotsPositionBanner2();
582 }
583 });
584
585 </script>
586</#if>
587
588
589<#-- CARRUSEL-TRES-CARD -->
590
591<#if referencesFieldSet?? && 0 < referencesFieldSet.getSiblings()?size && referencesFieldSet.getSiblings()[0].referenceId.getData()?has_content && (!hideTresCards?? || !getterUtil.getBoolean(hideTresCards.getData()))>
592 <#assign colorClass = "" />
593 <#assign fullBody = "" />
594 <#if fondoColorCarruselCards?? && fondoColorCarruselCards.getData()??>
595 <#if fondoColorCarruselCards.getData()=="blanc">
596 <#assign colorClass = "hola-bcn-carrusel-standard--white" />
597 <#assign fullBody = "full-body__container" />
598 <#else>
599 <#assign colorClass = "hola-bcn-carrusel-standard--gray" />
600 <#assign fullBody = "full-body__container" />
601 </#if>
602 </#if>
603
604 <section class="hola-bcn-carrusel-standard ${colorClass}">
605 <div class="hola-bcn-carrusel-standard-cont-ext hola-bcn-carrusel-standard-cont-ext-extra hola-bcn-carrusel-standard-cont-ext-flex ${fullBody}">
606 <div class="hola-bcn-carrusel-standard--container">
607 <div class="hola-bcn-carrusel-standard--outer">
608 <div class="hola-bcn-carrusel-standard_new-header">
609 <h2 class="title title--1 hola-bcn-carrusel-standard__title hola-bcn-carrusel-standard__title_new">${titleCarruselCards.getData()}</h2>
610 <p class="hola-bcn-carrusel-standard__intro-text">${subtitleCarruselCards.getData()}</p>
611 </div>
612 <ul id="result-list" class="hola-bcn-carrusel-standard__items js__hola-bcn-standard-slider">
613 <#assign tmbGroupId = 20182>
614 <#assign fundacioGroupId = 79790>
615 <#list referencesFieldSet.getSiblings() as element>
616 <#assign JournalArticleLocalService = serviceLocator.findService("com.liferay.journal.service.JournalArticleLocalService")>
617 <#assign articleId = element.referenceId.getData()>
618 <#assign groupId = getterUtil.getLong(groupId)>
619 <#attempt>
620 <#assign journalArticle = JournalArticleLocalService.getArticle(groupId, articleId) />
621 <#recover>
622 <#if groupId == tmbGroupId>
623 <#assign groupId = fundacioGroupId>
624 <#else>
625 <#assign groupId = tmbGroupId>
626 </#if>
627 <#attempt>
628 <#assign journalArticle = JournalArticleLocalService.getArticle(groupId, articleId)!>
629 <#recover>
630 <#assign journalArticle = "">
631 </#attempt>
632 </#attempt>
633 <#if journalArticle?has_content && journalArticle != "">
634 <#assign document = saxReaderUtil.read(journalArticle.getContent())>
635 <#assign rootElement = document.getRootElement()>
636
637 <#assign resourceprimKey = journalArticle.getResourcePrimKey()>
638 <#assign assetEntry = assetEntryLocalService.getEntry("com.liferay.journal.model.JournalArticle", resourceprimKey)>
639 <#assign assetRenderer = assetEntry.getAssetRenderer()>
640 <#assign articleURL = assetRenderer.getURLViewInContext(renderRequest, renderResponse, "")>
641 <#assign articleFriendlyURL = assetRenderer.getUrlTitle()>
642 <#assign newwindow = "">
643 <#if !articleURL?has_content>
644 <#assign newwindow = "target='_blank'">
645 <#if !isFundacio>
646 <#if currentURL?contains("pre3")>
647 <#assign articleURL = "https://pre3-fundacio.tmb.cat/" + locale.getLanguage() + "/w/" + articleFriendlyURL>
648 <#else>
649 <#assign articleURL = "https://fundacio.tmb.cat/" + locale.getLanguage() + "/w/" + articleFriendlyURL>
650 </#if>
651 <#else>
652 <#if currentURL?contains("pre3")>
653 <#assign articleURL = "https://pre3.tmb.cat/" + locale.getLanguage() + "/w/" + articleFriendlyURL>
654 <#else>
655 <#assign articleURL = "https://www.tmb.cat/" + locale.getLanguage() + "/w/" + articleFriendlyURL>
656 </#if>
657 </#if>
658 </#if>
659
660 <#assign title = "">
661 <#assign titleSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='titleGlobal']/dynamic-content[@language-id='" + locale + "']")>
662 <#if titleSel.selectSingleNode(rootElement)?has_content>
663 <#assign title = titleSel.selectSingleNode(rootElement).getStringValue()>
664 </#if>
665
666 <#assign subtitle = "">
667 <#assign subtitleSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='subtitleGlobal']/dynamic-content[@language-id='" + locale + "']")>
668 <#if subtitleSel.selectSingleNode(rootElement)?has_content>
669 <#assign subtitle = subtitleSel.selectSingleNode(rootElement).getStringValue()>
670 </#if>
671
672 <#assign initDateNovetatAgenda = "">
673 <#assign fromInitDateNovetatAgenda = "">
674 <#assign endDateNovetatAgenda = "">
675 <#assign whereNovetatAgenda = "">
676 <#assign novetatAgendaSel = rootElement.selectSingleNode("dynamic-element[@field-reference='blocInfoAgenda']")!"">
677 <#if novetatAgendaSel?has_content>
678 <#assign dateNovetatAgendaSelSel = novetatAgendaSel.selectSingleNode("dynamic-element[@field-reference='whenBlocInfoAgenda']")!"">
679
680 <#if dateNovetatAgendaSelSel?has_content && dateNovetatAgendaSelSel.selectSingleNode("dynamic-element[@field-reference='initDateBlocInfoAgenda']/dynamic-content[@language-id='" + locale + "']")?has_content>
681 <#assign initDateNovetatAgenda = dateNovetatAgendaSelSel.selectSingleNode("dynamic-element[@field-reference='initDateBlocInfoAgenda']/dynamic-content[@language-id='" + locale + "']").getStringValue()>
682 </#if>
683
684 <#if dateNovetatAgendaSelSel?has_content && dateNovetatAgendaSelSel.selectSingleNode("dynamic-element[@field-reference='fromInitDateBlocInfoAgenda']/dynamic-content[@language-id='" + locale + "']")?has_content>
685 <#assign fromInitDateNovetatAgenda = dateNovetatAgendaSelSel.selectSingleNode("dynamic-element[@field-reference='fromInitDateBlocInfoAgenda']/dynamic-content[@language-id='" + locale + "']").getStringValue()>
686 </#if>
687
688 <#if dateNovetatAgendaSelSel?has_content && dateNovetatAgendaSelSel.selectSingleNode("dynamic-element[@field-reference='endDateBlocInfoAgenda']/dynamic-content[@language-id='" + locale + "']")?has_content>
689 <#assign endDateNovetatAgenda = dateNovetatAgendaSelSel.selectSingleNode("dynamic-element[@field-reference='endDateBlocInfoAgenda']/dynamic-content[@language-id='" + locale + "']").getStringValue()>
690 </#if>
691
692 <#assign whereNovetatAgendaSelSel = novetatAgendaSel.selectSingleNode("dynamic-element[@field-reference='whereBlocInfoAgenda']")!"">
693 <#if whereNovetatAgendaSelSel?has_content && whereNovetatAgendaSelSel.selectSingleNode("dynamic-element[@field-reference='textWhereBlocInfoAgenda']/dynamic-content[@language-id='" + locale + "']")?has_content>
694 <#assign whereNovetatAgenda = whereNovetatAgendaSelSel.selectSingleNode("dynamic-element[@field-reference='textWhereBlocInfoAgenda']/dynamic-content[@language-id='" + locale + "']").getStringValue()>
695 </#if>
696 </#if>
697
698 <#assign typeNovetatAgenda = "">
699 <#assign typeNovetatAgendaSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='typeNovetatAgenda']/dynamic-content[@language-id='" + locale + "']")>
700 <#if typeNovetatAgendaSel.selectSingleNode(rootElement)?has_content>
701 <#assign typeNovetatAgenda = typeNovetatAgendaSel.selectSingleNode(rootElement).getStringValue()>
702 </#if>
703
704 <#assign filterNovetatAgenda = "">
705 <#assign filterNovetatAgendaSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='filterNovetatAgenda']/dynamic-content[@language-id='" + locale + "']")>
706 <#if filterNovetatAgendaSel.selectSingleNode(rootElement)?has_content>
707 <#assign filterNovetatAgenda = filterNovetatAgendaSel.selectSingleNode(rootElement).getStringValue()>
708 </#if>
709
710 <#assign imageNovetatAgenda = "">
711 <#assign imageNovetatAgendaSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='imageCardNovetatAgenda']/dynamic-content[@language-id='" + locale + "']")>
712 <#if imageNovetatAgendaSel.selectSingleNode(rootElement)?has_content>
713 <#assign image = imageNovetatAgendaSel.selectSingleNode(rootElement).getStringValue()>
714 <#assign imageUuid = jsonFactoryUtil.createJSONObject(image).uuid!"">
715 <#assign imageNovetatAgenda = themeDisplay.getPortalURL() + themeDisplay.getPathContext() + "/documents/" + groupId + "/" + imageUuid>
716 </#if>
717
718 <#assign imageAltNovetatAgenda = "">
719 <#assign imageAltNovetatAgendaSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='altImageCardNovetatAgenda']/dynamic-content[@language-id='" + locale + "']")>
720 <#if imageAltNovetatAgendaSel.selectSingleNode(rootElement)?has_content>
721 <#assign imageAltNovetatAgenda = imageAltNovetatAgendaSel.selectSingleNode(rootElement).getStringValue()>
722 </#if>
723
724 <#assign pubDateNovetatAgenda = "">
725 <#assign pubDateNovetatAgendaSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='pubDateNovetatAgenda']/dynamic-content[@language-id='" + locale + "']")>
726 <#if pubDateNovetatAgendaSel.selectSingleNode(rootElement)?has_content>
727 <#assign pubDateNovetatAgenda = pubDateNovetatAgendaSel.selectSingleNode(rootElement).getStringValue()>
728 </#if>
729
730 <#assign pubTimeNovetatAgenda = "">
731 <#assign pubTimeNovetatAgendaSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='pubTimeNovetatAgenda']/dynamic-content[@language-id='" + locale + "']")>
732 <#if pubTimeNovetatAgendaSel.selectSingleNode(rootElement)?has_content>
733 <#assign pubTimeNovetatAgenda = pubTimeNovetatAgendaSel.selectSingleNode(rootElement).getStringValue()>
734 </#if>
735
736 <#assign despubDateNovetatAgenda = "">
737 <#assign despubDateNovetatAgendaSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='despubDateNovetatAgenda']/dynamic-content[@language-id='" + locale + "']")>
738 <#if despubDateNovetatAgendaSel.selectSingleNode(rootElement)?has_content>
739 <#assign despubDateNovetatAgenda = despubDateNovetatAgendaSel.selectSingleNode(rootElement).getStringValue()>
740 </#if>
741
742 <#assign despubTimeNovetatAgenda = "">
743 <#assign despubTimeNovetatAgendaSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='despubTimeNovetatAgenda']/dynamic-content[@language-id='" + locale + "']")>
744 <#if despubTimeNovetatAgendaSel.selectSingleNode(rootElement)?has_content>
745 <#assign despubTimeNovetatAgenda = despubTimeNovetatAgendaSel.selectSingleNode(rootElement).getStringValue()>
746 </#if>
747
748 <#assign isExpiredNovetatAgenda = "">
749 <#assign isExpiredNovetatAgendaSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='isExpiredNovetatAgenda']/dynamic-content[@language-id='" + locale + "']")>
750 <#if isExpiredNovetatAgendaSel.selectSingleNode(rootElement)?has_content>
751 <#assign isExpiredNovetatAgenda = isExpiredNovetatAgendaSel.selectSingleNode(rootElement).getStringValue()>
752 </#if>
753
754 <#assign isPublishedNA = false>
755 <#if (pubDateNovetatAgenda?has_content)>
756 <#if pubTimeNovetatAgenda?has_content>
757 <#assign timeActDate = pubTimeNovetatAgenda?date["HH:mm"]>
758 <#assign timeActFormat = timeActDate?string["HH:mm"]>
759 <#else>
760 <#assign timeActDate = "">
761 <#assign timeActFormat = "">
762 </#if>
763 <#attempt>
764 <#assign dataAct = pubDateNovetatAgenda?date["yyyy-MM-dd"]>
765
766 <#if timeActFormat?has_content && timeActFormat != "">
767 <#assign dataActMil = miliSeconds(timeActFormat dataAct?long)>
768 <#assign dataAct = dateUtil.newDate(getterUtil.getLong(dataActMil))>
769 </#if>
770 <#assign dataActMil = dataAct?long>
771 <#assign now = .now?long+timeZoneUtil.getTimeZone("Europe/Madrid").getOffset(.now?long)>
772 <#assign isPublishedNA = (dataActMil - now ) < 0 />
773 <#recover>
774 </#attempt>
775 </#if>
776
777 <#assign isDespublishedNA = false>
778 <#if (despubDateNovetatAgenda?has_content)>
779 <#if despubTimeNovetatAgenda?has_content>
780 <#assign timeExpDate = despubTimeNovetatAgenda?date["HH:mm"]>
781 <#assign timeExpFormat = timeExpDate?string["HH:mm"]>
782 <#else>
783 <#assign timeExpDate = "">
784 <#assign timeExpFormat = "">
785 </#if>
786 <#attempt>
787 <#assign dataExp = despubDateNovetatAgenda?date["yyyy-MM-dd"]>
788
789 <#if timeExpFormat?has_content && timeExpFormat != "">
790 <#assign dataExpMil = miliSeconds(timeExpFormat dataExp?long)>
791 <#assign dataExp = dateUtil.newDate(getterUtil.getLong(dataExpMil))>
792 </#if>
793 <#assign dataExpMil = dataExp?long>
794 <#assign now = .now?long+timeZoneUtil.getTimeZone("Europe/Madrid").getOffset(.now?long)>
795 <#assign isDespublishedNA = (dataExpMil - now) < 0 />
796 <#recover>
797 </#attempt>
798 </#if>
799
800 <#assign isExpiredNA = false>
801 <#if journalArticle.expirationDate??>
802 <#assign dataExp = journalArticle.expirationDate?datetime>
803 <#attempt>
804 <#assign dataExpMil = dataExp?long>
805 <#assign now = .now?long+timeZoneUtil.getTimeZone("Europe/Madrid").getOffset(.now?long)>
806 <#assign isExpiredNA = (dataExpMil - now) < 0 />
807 <#recover>
808 </#attempt>
809 </#if>
810
811 <#assign showNovetatAgenda = false>
812 <#if typeNovetatAgenda?has_content && typeNovetatAgenda == "1">
813 <#assign showNovetatAgenda = isPublishedNA && !isExpiredNA && !isDespublishedNA && isExpiredNovetatAgenda != "true">
814 <#else>
815 <#assign showNovetatAgenda = isPublishedNA && !isExpiredNA && isExpiredNovetatAgenda != "true">
816 </#if>
817
818 <#if showNovetatAgenda>
819 <#if title?has_content>
820 <li class="hola-bcn-carrusel-standard_new-li">
821 <a ${newwindow} class="hola-bcn-carrusel-standard_new <#if isDespublishedNA>hola-bcn-carrusel-standard_new-finished</#if>" href="${articleURL}">
822 <div class="hola-bcn-carrusel-standard__card-cover">
823 <div class="hola-bcn-carrusel-standard__card-cover-filter"></div>
824 <img class="hola-bcn-carrusel-standard__image" src="${imageNovetatAgenda}" <#if imageAltNovetatAgenda?has_content>alt="${imageAltNovetatAgenda}"<#else>alt=""</#if>>
825 <div class="hola-bcn-carrusel-standard-finished-text" <#if isDespublishedNA>style="display: block;"</#if>>
826 <span><@liferay.language key='label.bloc.novetatagenda.finished' /></span>
827 </div>
828 <#if filterNovetatAgenda?has_content>
829 <div class="hola-bcn-carrusel-standard-highlight">
830 <span><@liferay.language key='label.bloc.novetatagenda.filter.${filterNovetatAgenda}' /></span>
831 </div>
832 </#if>
833 </div>
834 <div class="hola-bcn-carrusel-standard-container">
835 <div>
836 <h3 class="hola-bcn-carrusel-standard__card-title">
837 ${title}
838 <#if newwindow?? && newwindow?has_content>
839 <span class="icon-external-black" alt="Enllaç extern" title="(Obre una nova finestra)"></span>
840 </#if>
841 </h3>
842 <span class="hola-bcn-carrusel-standard__card-description">
843 ${subtitle}
844 </span>
845 </div>
846 <#if initDateNovetatAgenda?has_content || endDateNovetatAgenda?has_content || (whereNovetatAgenda?has_content)>
847 <div class="hola-bcn-carrusel-standard_bottom-extra">
848 <#if initDateNovetatAgenda?has_content || endDateNovetatAgenda?has_content>
849 <div class="hola-bcn-carrusel-standard-date">
850 <#if fromInitDateNovetatAgenda == "true">
851 <span><b><@liferay.language key='label.bloc.novetatagenda.when' /></b> <@liferay.language key='label.bloc.novetatagenda.from' /> ${initDateNovetatAgenda?date["yyyy-MM-dd"]?string("dd/MM/yyyy")}</span>
852 <#else>
853 <span><b><@liferay.language key='label.bloc.novetatagenda.when' /></b> <@liferay.language key='label.bloc.novetatagenda.from' /> ${initDateNovetatAgenda?date["yyyy-MM-dd"]?string("dd/MM/yyyy")}<#if endDateNovetatAgenda?has_content> <@liferay.language key='label.bloc.novetatagenda.to' /> ${endDateNovetatAgenda?date["yyyy-MM-dd"]?string("dd/MM/yyyy")}</#if></span>
854 </#if>
855 </div>
856 </#if>
857 <#if whereNovetatAgenda?has_content>
858 <div class="hola-bcn-carrusel-standard-where">
859 <span><b><@liferay.language key='label.bloc.novetatagenda.where' /> <span class="hola-bcn-carrusel-standard-where-inner">${whereNovetatAgenda}</span></b></span>
860 </div>
861 </#if>
862 </div>
863 </#if>
864 </div>
865 </a>
866 </li>
867 </#if>
868 </#if>
869 </#if>
870 </#list>
871 </ul>
872 </div>
873 </div>
874 </div>
875 </section>
876
877 <script type="text/javascript">
878
879 $(document).ready(function() {
880 initSliderBcnStandard();
881 });
882
883 function initSliderBcnStandard() {
884 if($(".js__hola-bcn-standard-slider").hasClass('slick-initialized')) {
885 $(".js__hola-bcn-standard-slider").slick("unslick");
886 }
887
888 $('.js__hola-bcn-standard-slider').slick({
889 slidesToShow: 3,
890 slidesToScroll: 1,
891 arrows: false,
892 dots: false,
893 draggable: false,
894 infinite: false,
895 responsive: [
896 {
897 breakpoint: 767,
898 settings: {
899 variableWidth: true,
900 slidesToShow: 2,
901 slidesToScroll: 1,
902 arrows: false,
903 dots: true,
904 draggable: true,
905 infinite: true
906 }
907 }
908 ]
909 });
910 }
911
912 </script>
913</#if>

Et trobes a:
Exposició La petita història del metro
Un viatge de cent anys d'història en dibuixos.
Quan: 10.01.2025 a 19.03.2025
On: Espai Mercè Sala - Fundació TMB
Accés: Entrada gratuïta*
Barcelona celebra cent anys del metro: el 30 de desembre de 1924, el primer tren de la xarxa de metro de Barcelona sortia de l'estació de Lesseps en direcció a Passeig de Gràcia. Des de llavors, el suburbà de la ciutat ha anat creixent i adaptant-se als nous temps.
TMB i la Fundació TMB han creat un ventall d'accions que, emmarcades dins d'una gran campanya de comunicació, s'aniran duent a terme a la xarxa del suburbà durant tot 2025: publicacions de llibres, esdeveniments molt variats, visites guiades, exposicions i molt més.
Una de les publicacions més especials és La petita història del metro, un viatge de 100 anys a través de les magnífiques il·lustracions de Pilarín Bayés i els textos de Daniel Venteo. Aquest llibre, a més d'apropar petits i grans a la història del metro a través de les seves explicacions, desprèn una tendresa peculiar, que hem volgut portar a les parets de l'Espai Mercè Sala.
Tant si ja has tingut l'oportunitat que aquest llibre caigui a les teves mans com si no, vine a visitar l'exposició i gaudeix del viatge!
Què hi trobaràs a l'exposició?
Saps quin dia i quin any es va inaugurar la primera línia del metro de Barcelona? I quantes estacions tenia?
Sabies que durant la Generalitat republicana el metro ja va arribar a l’Hospitalet de Llobregat
O que durant la Guerra Civil espanyola la ciutadania va utilitzar-lo sovint com a refugi per a protegir-se de les bombes?
Sabies que no va ser fins a principis dels anys seixanta que el servei de metro es va municipalitzar i convertir en un servei públic de garantia del dret universal a la mobilitat que és avui?
Sabies que el 1992, amb els Jocs Olímpics de Barcelona, el metro va fer un nou impuls obrint-se pas cap a Santa Coloma de Gramenet i Badalona?
Sabies que avui té 125 quilòmetres de vies i fins a 165 estacions que faciliten prop de 280 milions de viatges l’any? O que la línia 9 del metro, que acaba a l’aeroport del Prat, és automàtica i una de les més modernes d’Europa?
El metro de Barcelona reuneix una i mil històries del passat, del present i del futur.
També et pot interessar
-
FinalitzatCampanya
Quan viatgis en bus, fes-ho fàcil
El teu trajecte serà més àgil i pràctic, i també facilitaràs la feina al conductor. -
FinalitzatCampanya
Quan viatgis en metro, fes-ho de manera segura
Nosaltres vetllem per la teva seguretat, tu evites accions que posen en perill la teva integritat i el bon funcionament del servei. -
FinalitzatCampanya
Sempre hi som
El metro i els busos tenen càmeres de videovigilància en temps real perquè viatgis amb seguretat.
The following has evaluated to null or missing: ==> detallAgenda.elementsDetallAgenda.getSiblings()[0].titleDetallAgenda [in template "20155#20195#1501272" at line 308, column 85] ---- Tip: It's the step after the last dot that caused this error, not those before it. ---- Tip: If the failing expression is known to legally refer to something that's sometimes null or missing, either specify a default value like myOptionalVar!myDefault, or use <#if myOptionalVar??>when-present<#else>when-missing</#if>. (These only cover the last step of the expression; to cover the whole expression, use parenthesis: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)?? ---- ---- FTL stack trace ("~" means nesting-related): - Failed at: #if detallAgenda?? && 0 < detallAgend... [in template "20155#20195#1501272" at line 308, column 1] ----
1<#assign imagesFolder = themeDisplay.getPathThemeImages()>
2<#assign assetEntryLocalService = serviceLocator.findService("com.liferay.asset.kernel.service.AssetEntryLocalService")>
3<#assign currentURL = request.getRequestURL() />
4<#assign isFundacio = false>
5<#if currentURL?contains("fundacio")>
6 <#assign isFundacio = true>
7</#if>
8
9<#function miliSeconds dateString firstDate>
10 <#assign params = dateString?split(":")>
11
12 <#if params?size == 2>
13 <#assign param1 = params[0]>
14 <#assign param2 = params[1]>
15 <#assign param1 = getterUtil.getLong(param1)*3600000>
16 <#assign param2 = getterUtil.getLong(param2)*60000>
17 <#assign finalMilSec = param1 + param2>
18 <#assign finalMilSecLong = getterUtil.getLong(finalMilSec)>
19 <#assign resultLong = firstDate + finalMilSecLong>
20
21 <#return resultLong>
22 </#if>
23</#function>
24
25<#-- header-image -->
26
27<#if upperImage?? && upperImage.getData()?has_content>
28 <div class="header-image">
29 <img src="${upperImage.getData()}" <#if upperImageAlt?? && upperImageAlt.getData()?has_content>alt="${upperImageAlt.getData()}"</#if>>
30 </div>
31</#if>
32
33
34<#-- breadcrumbs -->
35
36<div class="full-body__container breadcrumbs" style="float: unset; margin-right: auto; padding-bottom: 22px; padding-top: 22px;">
37 <p class="breadcrumbs__title"><@liferay.language key='header.breadcrumbs.text' />:</p>
38 <#if liferay_portlet?has_content><@liferay.breadcrumbs /></#if>
39</div>
40
41
42<#-- TITOL I SUBTITOL -->
43
44<#if titleGlobal?? && titleGlobal.getData()?has_content || subtitleGlobal?? && subtitleGlobal.getData()?has_content>
45 <div class="full-body__container basicav2-titol-subtitol">
46 <#if titleGlobal?? && titleGlobal.getData()?has_content><h1>${titleGlobal.getData()}</h1></#if>
47 <#if subtitleGlobal?? && subtitleGlobal.getData()?has_content><p>${subtitleGlobal.getData()}</p></#if>
48 </div>
49</#if>
50
51
52<#-- bloc-info-agenda -->
53
54<#if blocInfoAgenda?? && ((blocInfoAgenda.whenBlocInfoAgenda.initDateBlocInfoAgenda?? && blocInfoAgenda.whenBlocInfoAgenda.initDateBlocInfoAgenda.getData()?has_content) || (blocInfoAgenda.whereBlocInfoAgenda.textWhereBlocInfoAgenda?? && blocInfoAgenda.whereBlocInfoAgenda.textWhereBlocInfoAgenda.getData()?has_content) || (blocInfoAgenda.accesBlocInfoAgenda.textAccesBlocInfoAgenda?? && blocInfoAgenda.accesBlocInfoAgenda.textAccesBlocInfoAgenda.getData()?has_content)) && (!blocInfoAgenda.hideBlocInfoAgenda?? || !getterUtil.getBoolean(blocInfoAgenda.hideBlocInfoAgenda.getData()))>
55 <div class="full-body__container bloc-info-agenda">
56 <div class="bloc-info-agenda-elements">
57 <#if blocInfoAgenda.whenBlocInfoAgenda.initDateBlocInfoAgenda?? && blocInfoAgenda.whenBlocInfoAgenda.initDateBlocInfoAgenda.getData()?has_content>
58 <div class="bloc-info-agenda-element">
59 <#if blocInfoAgenda.whenBlocInfoAgenda.imageWhenBlocInfoAgenda?? && blocInfoAgenda.whenBlocInfoAgenda.imageWhenBlocInfoAgenda.getData()?has_content>
60 <img class="bloc-info-agenda-img" src="${blocInfoAgenda.whenBlocInfoAgenda.imageWhenBlocInfoAgenda.getData()}">
61 <#else>
62 <img class="bloc-info-agenda-img" src="${imagesFolder}/basic/24px/svg/calendar.svg">
63 </#if>
64 <#if blocInfoAgenda.whenBlocInfoAgenda.fromInitDateBlocInfoAgenda?? && blocInfoAgenda.whenBlocInfoAgenda.fromInitDateBlocInfoAgenda.getData()?has_content && getterUtil.getBoolean(blocInfoAgenda.whenBlocInfoAgenda.fromInitDateBlocInfoAgenda.getData())>
65 <div class="bloc-info-agenda-text"><p><@liferay.language key="label.bloc.novetatagenda.when"/> <b><@liferay.language key='label.bloc.novetatagenda.from' /> ${blocInfoAgenda.whenBlocInfoAgenda.initDateBlocInfoAgenda.getData()?date["yyyy-MM-dd"]?string("dd.MM.yyyy")}</b></p></div>
66 <#else>
67 <div class="bloc-info-agenda-text"><p><@liferay.language key="label.bloc.novetatagenda.when"/> <b>${blocInfoAgenda.whenBlocInfoAgenda.initDateBlocInfoAgenda.getData()?date["yyyy-MM-dd"]?string("dd.MM.yyyy")}<#if blocInfoAgenda.whenBlocInfoAgenda.endDateBlocInfoAgenda?? && blocInfoAgenda.whenBlocInfoAgenda.endDateBlocInfoAgenda.getData()?has_content> <@liferay.language key="label.bloc.novetatagenda.to"/> ${blocInfoAgenda.whenBlocInfoAgenda.endDateBlocInfoAgenda.getData()?date["yyyy-MM-dd"]?string("dd.MM.yyyy")}</#if></b></p></div>
68 </#if>
69 </div>
70 <hr>
71 </#if>
72 <#if blocInfoAgenda.whereBlocInfoAgenda.textWhereBlocInfoAgenda?? && blocInfoAgenda.whereBlocInfoAgenda.textWhereBlocInfoAgenda.getData()?has_content>
73 <div class="bloc-info-agenda-element">
74 <#if blocInfoAgenda.whereBlocInfoAgenda.imageWhereBlocInfoAgenda?? && blocInfoAgenda.whereBlocInfoAgenda.imageWhereBlocInfoAgenda.getData()?has_content>
75 <img class="bloc-info-agenda-img" src="${blocInfoAgenda.whereBlocInfoAgenda.imageWhereBlocInfoAgenda.getData()}">
76 <#else>
77 <img class="bloc-info-agenda-img" src="${imagesFolder}/basic/24px/svg/location_on.svg">
78 </#if>
79 <div class="bloc-info-agenda-text"><p><@liferay.language key="label.bloc.novetatagenda.where"/> <b>${blocInfoAgenda.whereBlocInfoAgenda.textWhereBlocInfoAgenda.getData()}</b></p></div>
80 </div>
81 <hr>
82 </#if>
83 <#if blocInfoAgenda.accesBlocInfoAgenda.textAccesBlocInfoAgenda?? && blocInfoAgenda.accesBlocInfoAgenda.textAccesBlocInfoAgenda.getData()?has_content>
84 <div class="bloc-info-agenda-element">
85 <#if blocInfoAgenda.accesBlocInfoAgenda.imageAccesBlocInfoAgenda?? && blocInfoAgenda.accesBlocInfoAgenda.imageAccesBlocInfoAgenda.getData()?has_content>
86 <img class="bloc-info-agenda-img" src="${blocInfoAgenda.accesBlocInfoAgenda.imageAccesBlocInfoAgenda.getData()}">
87 <#else>
88 <img class="bloc-info-agenda-img" src="${imagesFolder}/basic/24px/svg/ticket.svg">
89 </#if>
90 <div class="bloc-info-agenda-text"><p><@liferay.language key="label.bloc.novetatagenda.acces"/> <b>${blocInfoAgenda.accesBlocInfoAgenda.textAccesBlocInfoAgenda.getData()}</b></p></div>
91 </div>
92 </#if>
93 </div>
94 <#if blocInfoAgenda.textBottomBlocInfoAgenda?? && blocInfoAgenda.textBottomBlocInfoAgenda.getData()?has_content>
95 <div class="bloc-info-agenda-bottom">
96 <span>${blocInfoAgenda.textBottomBlocInfoAgenda.getData()}</span>
97 </div>
98 </#if>
99 </div>
100</#if>
101
102<#-- text-center -->
103
104<#if textCenter?? && textCenter.getData()?has_content>
105 <div class="full-body__container text-center-basic">
106 ${textCenter.getData()}
107 </div>
108</#if>
109
110
111<#-- image-center -->
112
113<#if imageCenter?? && imageCenter.getData()?has_content>
114 <div class="full-body__container image-center-basic">
115 <img src="${imageCenter.getData()}">
116 </div>
117</#if>
118
119
120<#-- TEXT-CARRUSEL-IMATGES -->
121
122<#if textCarruselImatges1?? && 0 < textCarruselImatges1.elementsFieldSet.getSiblings()?size && textCarruselImatges1.elementsFieldSet.getSiblings()[0].elementsFieldSetFieldSet.image?? && textCarruselImatges1.elementsFieldSet.getSiblings()[0].elementsFieldSetFieldSet.image.getData()?has_content && (!textCarruselImatges1.hideTextCarruselImatges?? || !getterUtil.getBoolean(textCarruselImatges1.hideTextCarruselImatges.getData()))>
123 <#assign entriesMapList = []>
124 <#foreach elem in textCarruselImatges1.elementsFieldSet.getSiblings()>
125 <#if elem.elementsFieldSetFieldSet.order?has_content>
126 <#assign currentOrder = elem.elementsFieldSetFieldSet.order.getData()>
127 </#if>
128 <#if !currentOrder?has_content || currentOrder == "null">
129 <#assign currentOrder = "99">
130 </#if>
131 <#assign currEntryMap = {"entry" : elem.elementsFieldSetFieldSet , "order" : currentOrder?number}>
132 <#assign entriesMapList = entriesMapList + [currEntryMap]>
133 </#foreach>
134
135 <#assign sortedEntriesMapList = entriesMapList?sort_by("order")>
136 <#assign sortedEntriesRootElems = []>
137
138 <#foreach currEntryMap in sortedEntriesMapList>
139 <#assign sortedEntriesRootElems = sortedEntriesRootElems + [currEntryMap.entry]>
140 </#foreach>
141
142 <#assign leftContent = "">
143 <#if textCarruselImatges1.titleHeader?? && textCarruselImatges1.titleHeader.getData()?has_content && textCarruselImatges1.descHeader?? && textCarruselImatges1.descHeader?has_content>
144 <#assign leftContent = "true">
145 </#if>
146
147 <div class="full-body__container hero-carousel-new hero-carousel hero-carousel--super hero-carousel-banner-alt <#if !leftContent?has_content>hero-carousel-banner-solo</#if>">
148 <#if leftContent?has_content>
149 <div class="hero-carousel__container-banner">
150 <h2 class="hero-carousel-banner-alt-title">
151 ${textCarruselImatges1.titleHeader.getData()}
152 </h2>
153 <p class="hero-carousel-banner-alt-desc">
154 ${textCarruselImatges1.descHeader.getData()}
155 </p>
156 </div>
157 </#if>
158 <div aria-live="polite" aria-atomic="false" aria-relevant="all" class="slick-list draggable">
159 <div class="hero-carousel__container js-carousel-banner-al_1 is-playing"
160 data-prev-text='<@liferay.language key="label.carousel.prev"/>'
161 data-next-text='<@liferay.language key="label.carousel.next"/>'
162 data-pagination-text='<@liferay.language key="label.carousel.outstanding"/>'
163 data-stop-text='<@liferay.language key="label.carousel.pause"/>'
164 data-play-text='<@liferay.language key="label.carousel.start"/>'>
165 <#if sortedEntriesRootElems?has_content>
166 <#foreach element in sortedEntriesRootElems>
167 <div class="hero hero--super">
168 <div class="hero__container">
169 <#if element.typeLink.getData() == "video">
170 <a href="#" onclick='showVideoModalBanner(`${element.External_Link.getData()}`);return false;' class="hero__link" <#if element.titleLink?? && element.titleLink.getData()?has_content>title="${element.titleLink.getData()}"</#if>>
171 <#else>
172 <a class="hero__link" <#if element.titleLink?? && element.titleLink.getData()?has_content>title="${element.titleLink.getData()}"</#if> <#if element.typeLink.getData() == "extern"> href="${element.External_Link.getData()}" target="_blank" <#elseif element.typeLink.getData() == "intern" && element.Internal_Link?? && element.Internal_Link.getFriendlyUrl()?has_content> href="${element.Internal_Link.getFriendlyUrl()}" target="_self" <#elseif element.typeLink.getData() == "intern" && element.External_Link?? && element.External_Link.getData()?has_content> href="${element.External_Link.getData()}" target="_self" </#if>>
173 </#if>
174 <div class="hero__media <#if (!element.titleElem?? || !element.titleElem.getData()?has_content) && (!element.descElem?? || !element.descElem.getData()?has_content)>hero__media-no-fade</#if>">
175 <#if element.typeLink.getData() == "video">
176 <div class="hero__media-video__container">
177 <span class="hero__media-video__img">
178 </span>
179 </div>
180 </#if>
181 <img class="hero__image hero__image-new lazyload" data-src="${element.image.getData()}" <#if element.altImage?? && element.altImage.getData()?has_content>alt="${element.altImage.getData()}"</#if>>
182 </div>
183 <div class="hero__content white__banner">
184 <p class="hero__title" >
185 ${element.titleElem.getData()}
186 <#if element.typeLink.getData() == "extern">
187 <span class="window-warning">
188 <img class="window-warning__icon" src="${imagesFolder}/basic/16px/png/icone-obrir-fora-blanc-16x16.png" alt="<@liferay.language key="label.externalLink.alt"/>" title="<@liferay.language key="label.externalLink.title"/>">
189 </span>
190 </#if>
191 </p>
192 <p class="hero__desc-alt" >
193 ${element.descElem.getData()}
194 </p>
195 </div>
196 </a>
197 </div>
198 </div>
199 </#foreach>
200 </#if>
201 </div>
202 </div>
203 </div>
204
205 <div class="dialog">
206 <div id="carrusel-banner-video" class="u-hidden">
207 <div class="dialog__body dialog__body--jotmbe" id="carrusel-banner-video-content">
208 </div>
209 </div>
210 </div>
211 <script type="text/javascript">
212 initSliderCarruselBanner1();
213
214 function initSliderCarruselBanner1() {
215 if($(".js-carousel-banner-al_1").hasClass('slick-initialized')) {
216 $(".js-carousel-banner-al_1").slick("unslick");
217 }
218 $('.js-carousel-banner-al_1 .slick-toggle-play').remove();
219 $('.js-carousel-banner-al_1').slick({
220 slidesToShow: 1,
221 arrows: true,
222 draggable: true,
223 infinite: false,
224 variableWidth: false,
225 autoplaySpeed: 4000,
226 dots: true,
227 nextArrow: '<button type="button" class="slick-next"><img class="slick-next__icon slick-next__icon-normal" src="${imagesFolder}/basic/18px/svg/arrow-next-black.svg" alt=\'<@liferay.language key="label.next"/>\'/><img class="slick-next__icon slick-next__icon-disabled" src="${imagesFolder}/basic/18px/svg/arrow-next-gray.svg" alt=\'<@liferay.language key="label.next"/>\'/></button>',
228 prevArrow: '<button type="button" class="slick-prev"><img class="slick-prev__icon slick-prev__icon-normal" src="${imagesFolder}/basic/18px/svg/arrow-prev-black.svg" alt=\'<@liferay.language key="label.prev"/>\'/><img class="slick-prev__icon slick-prev__icon-disabled" src="${imagesFolder}/basic/18px/svg/arrow-prev-gray.svg" alt=\'<@liferay.language key="label.prev"/>\'/></button>',
229 responsive: [
230 {
231 breakpoint: 767,
232 settings: {
233 slidesToShow: 1,
234 arrows: false,
235 variableWidth: true,
236 dots: true
237 }
238 }
239 ]
240 }).each(function () {
241 var carousel = $(this),
242 toggleButton,
243 toggleIcon;
244
245 carousel.find('.slick-next__icon').attr({
246 'alt': carousel.data('next-text')
247 });
248
249 carousel.find('.slick-prev__icon').attr({
250 'alt': carousel.data('prev-text')
251 });
252 });
253
254 if ($('.hero-carousel__container .hero').length == 1) {
255 $('.hero-carousel__container .slick-toggle-play').hide();
256 }
257
258 $('.slick-cloned[aria-describedby]').removeAttr('aria-describedby');
259 if($(".js-carousel-banner-al_1 .slick-dots").length > 0) {
260 setDotsPositionBanner1();
261 }
262 }
263
264 function showVideoModalBanner(link) {
265 const start = link.indexOf("v=") + 2;
266 const end = start + 2 + 11;
267
268 TMB.dialog.newModal(langJotmbeClose, "dialog--jotmbe__no-footer dialog--jotmbe__no-icon dialog--jotmbe__with-actions dialog-video-iframe", "carrusel-banner-video", "");
269 $('#carrusel-banner-video-content').html('<iframe class="home-carrusel-video-iframe" src="https://www.youtube.com/embed/'+link.substring(start, end)+'" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>');
270 }
271 function setDotsPositionBanner1() {
272 $(".js-carousel-banner-al_1 .slick-dots").appendTo($(".js-carousel-banner-al_1").parent());
273 }
274
275 window.addEventListener('resize', function(event){
276 const width = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth;
277 if($(".js-carousel-banner-al_1 .slick-dots").length > 0 && width > 768) {
278 setDotsPositionBanner1();
279 }
280 });
281
282 </script>
283</#if>
284
285
286<#-- BASICA-TITOL-TEXT -->
287
288<#if basicaTitolText?? && 0 < basicaTitolText.elementsBasica.getSiblings()?size && (basicaTitolText.elementsBasica.getSiblings()[0].titleBasica.getData()?has_content || basicaTitolText.elementsBasica.getSiblings()[0].contentBasica.getData()?has_content) && (!basicaTitolText.hideBasicaTitolText?? || !getterUtil.getBoolean(basicaTitolText.hideBasicaTitolText.getData()))>
289 <div class="full-body__container basica-titol-text">
290 <#foreach elem in basicaTitolText.elementsBasica.getSiblings()>
291 <div class="basica-titol-text-wrapper">
292 <#if elem.titleBasica?? && elem.titleBasica.getData()?has_content><h2 class="">${elem.titleBasica.getData()}</h2></#if>
293 <#if elem.contentBasica?? && elem.contentBasica.getData()?has_content><div class="basica-titol-text-content">${elem.contentBasica.getData()}</div></#if>
294 </div>
295 <#foreach subelem in elem.subelementsBasica.getSiblings()>
296 <div class="basica-titol-text-wrapper">
297 <#if subelem.subelementTitleBasica?? && subelem.subelementTitleBasica.getData()?has_content><h3>${subelem.subelementTitleBasica.getData()}</h3></#if>
298 <#if subelem.subelementContentBasica?? && subelem.subelementContentBasica.getData()?has_content><div class="basica-titol-text-content">${subelem.subelementContentBasica.getData()}</div></#if>
299 </div>
300 </#foreach>
301 </#foreach>
302 </div>
303</#if>
304
305
306<#-- bloc-detall-agenda -->
307
308<#if detallAgenda?? && 0 < detallAgenda.elementsDetallAgenda.getSiblings()?size && (detallAgenda.elementsDetallAgenda.getSiblings()[0].titleDetallAgenda.getData()?has_content || detallAgenda.elementsDetallAgenda.getSiblings()[0].contentDetallAgenda.getData()?has_content) && (!detallAgenda.hideDetallAgenda?? || !getterUtil.getBoolean(detallAgenda.hideDetallAgenda.getData()))>
309 <div class="full-body__container detall-agenda">
310 <#foreach elem in detallAgenda.elementsDetallAgenda.getSiblings()>
311 <div class="detall-agenda-wrapper">
312 <#if elem.titleDetallAgenda?? && elem.titleDetallAgenda.getData()?has_content><h2 class="">${elem.titleDetallAgenda.getData()}</h2></#if>
313 <#if elem.contentDetallAgenda?? && elem.contentDetallAgenda.getData()?has_content><div class="detall-agenda-content">${elem.contentDetallAgenda.getData()}</div></#if>
314 </div>
315 </#foreach>
316 <div class="detall-agenda-buttons-wrapper">
317 <#foreach subelem in detallAgenda.buttonsDetallAgenda.getSiblings()>
318 <a title="<#if subelem.accessibleTitleButtons?? && subelem.accessibleTitleButtons.getData()?has_content>${subelem.accessibleTitleButtons.getData()}</#if>" type="button" class="button button--a" <#if subelem.linkTypeDetallAgenda.getData() == "extern" && subelem.External_LinkDetallAgenda?? && subelem.External_LinkDetallAgenda.getData()?has_content> href="${subelem.External_LinkDetallAgenda.getData()}" rel="external" target="_blank" <#elseif subelem.linkTypeDetallAgenda.getData() == "intern" && subelem.Internal_LinkDetallAgenda?? && subelem.Internal_LinkDetallAgenda.getFriendlyUrl()?has_content> href="${subelem.Internal_LinkDetallAgenda.getFriendlyUrl()}" target="_self" <#elseif subelem.linkTypeDetallAgenda.getData() == "intern" && subelem.External_LinkDetallAgenda?? && subelem.External_LinkDetallAgenda.getData()?has_content> href="${subelem.External_LinkDetallAgenda.getData()}" target="_self" </#if>>
319 <span class="button__label">${subelem.linkTextDetallAgenda.getData()}</span>
320 </a>
321 </#foreach>
322 </div>
323 </div>
324</#if>
325
326
327<#-- DT_PP_TITULO_VIDEO -->
328
329<#if stPpVideo?? && stPpVideo.linkFieldSet.link.getData()?has_content && (!stPpVideo.hideStPpVideo?? || !getterUtil.getBoolean(stPpVideo.hideStPpVideo.getData()))>
330 <style>
331 .points-video__video-cover.no_video::after{
332 background: none;
333 }
334 </style>
335 <#assign hasLink = false>
336 <#if stPpVideo.linkHeader?? && stPpVideo.linkHeader.getData()?has_content && stPpVideo.linkHeaderText?? && stPpVideo.linkHeaderText.getData()?has_content>
337 <#assign hasLink = true>
338 </#if>
339 <section class="points-video bg-gray pt-56">
340 <div class="main__container">
341 <div class="full-body">
342 <div class="full-body__container points-video__header-extra-container">
343 <#if stPpVideo.linkFieldSet.linkFieldSetFieldSet.ancoraVideo.getData()?has_content && stPpVideo.linkFieldSet.linkFieldSetFieldSet.ancoraVideo.getData()?trim?has_content>
344 <a name="${stPpVideo.linkFieldSet.linkFieldSetFieldSet.ancoraVideo.getData()}" id="${stPpVideo.linkFieldSet.linkFieldSetFieldSet.ancoraVideo.getData()}">
345 </a>
346 </#if>
347 <#if stPpVideo.titol?? && stPpVideo.titol.getData()?has_content>
348 <div class="points-video__header">
349 <div class="points-video__header-extra" <#if !hasLink>style="justify-content: center; margin-right: 0;"</#if>>
350 <h2 class="points-video__title">
351 ${stPpVideo.titol.getData()}</h2>
352 <#if hasLink>
353 <a class="points-video__subtitle-link" href="${stPpVideo.linkHeader.getData()}">${stPpVideo.linkHeaderText.getData()}</a>
354 </#if>
355 </div>
356 <p class="points-video__description" <#if !hasLink>style="text-align: center; max-width: 100%;"</#if>>
357 ${stPpVideo.descriptiu.getData()}</p>
358 </div>
359 </#if>
360
361 <div class="points-video__video-item cookieconsent-optin-marketing media-unit__content" id="marketingCookies">
362 <#if stPpVideo.linkFieldSet.link.getData()?has_content>
363 <#assign start = stPpVideo.linkFieldSet.link.getData()?index_of("v=") + 2>
364 <#--13 because v= + 11 char for youtube ids
365 -->
366 <#assign end = start + 11>
367 <a href="${stPpVideo.linkFieldSet.link.getData()}" class="points-video__video-stPpVideo.linkFieldSet.link" title="${stPpVideo.linkFieldSet.linkFieldSetFieldSet.descriptiuVideo.getData()}"
368 rel="dialog-video" data-video="${stPpVideo.linkFieldSet.link.getData()?substring(start, end)}">
369 <div class="points-video__video-cover" style="background-image: url(${stPpVideo.linkFieldSet.linkFieldSetFieldSet.imgVideoFieldSet.imgVideo.getData()});">
370 <img src="${stPpVideo.linkFieldSet.linkFieldSetFieldSet.imgVideoFieldSet.imgVideo.getData()}" alt="${stPpVideo.linkFieldSet.linkFieldSetFieldSet.imgVideoFieldSet.imgVideoFieldSetFieldSet.alt.getData()}" class="points-video__video-image">
371 </div>
372 <#if stPpVideo.linkFieldSet.linkFieldSetFieldSet.descriptiuVideo.getData()?has_content>
373 <p class="points-video__caption">
374 ${stPpVideo.linkFieldSet.linkFieldSetFieldSet.descriptiuVideo.getData()}</p>
375 </#if>
376 </a>
377 <#else>
378 <a class="points-video__video-link" title="${stPpVideo.linkFieldSet.linkFieldSetFieldSet.descriptiuVideo.getData()}">
379 <div class="points-video__video-cover no_video" style="background-image: url(${stPpVideo.linkFieldSet.linkFieldSetFieldSet.imgVideoFieldSet.imgVideo.getData()});">
380 <img src="${stPpVideo.linkFieldSet.linkFieldSetFieldSet.imgVideoFieldSet.imgVideo.getData()}" alt="${stPpVideo.linkFieldSet.linkFieldSetFieldSet.imgVideoFieldSet.imgVideoFieldSetFieldSet.alt.getData()}" class="points-video__video-image">
381 </div>
382 <#if stPpVideo.linkFieldSet.linkFieldSetFieldSet.descriptiuVideo.getData()?has_content>
383 <p class="points-video__caption">
384 ${stPpVideo.linkFieldSet.linkFieldSetFieldSet.descriptiuVideo.getData()}</p>
385 </#if>
386 </a>
387
388 </#if>
389 </div>
390 <div class='cookieconsent-optout-marketing media-unit__content'>
391 <@liferay.language key="cookiebot.youtube.no-marketing"/>
392 </div>
393 <#if hasLink>
394 <a class="points-video__subtitle-link-mobile" href="${stPpVideo.linkHeader.getData()}">${stPpVideo.linkHeaderText.getData()}</a>
395 </#if>
396 </div>
397 </div>
398 </div>
399 </section>
400 <section class="video-dialog js__video-dialog u-hidden">
401 <div class="u-hidden" id="fragment-show-video">
402 <div class="video-dialog__panel">
403 <header class="video-dialog__header">
404 <button class="video-dialog__close js__video-dialog-close">
405 Cerrar</button>
406 </header>
407 <div class="video-dialog__content">
408 <div class="video-dialog__inner js__video-dialog-container">
409 <iframe data-cookieconsent="marketing" data-cookieblock-src="https://www.youtube.com/embed/${stPpVideo.linkFieldSet.link.getData()?substring(start, end)}" frameborder="0" class="video-dialog__media" allow="encrypted-media" allowfullscreen="">
410 </iframe>
411 </div>
412 </div>
413 </div>
414 </div>
415 <div class="video-dialog__overlay js__video-dialog-close">
416 </div>
417 </section>
418</#if>
419
420
421<#-- TEXT-CARRUSEL-IMATGES-ALT -->
422
423<#if textCarruselImatges2?? && 0 < textCarruselImatges2.elementsFieldSetAlt.getSiblings()?size && textCarruselImatges2.elementsFieldSetAlt.getSiblings()[0].elementsFieldSetFieldSetAlt.imageAlt?? && textCarruselImatges2.elementsFieldSetAlt.getSiblings()[0].elementsFieldSetFieldSetAlt.imageAlt.getData()?has_content && (!textCarruselImatges2.hideTextCarruselImatgesAlt?? || !getterUtil.getBoolean(textCarruselImatges2.hideTextCarruselImatgesAlt.getData()))>
424 <#assign imagesFolder = themeDisplay.getPathThemeImages()>
425
426 <#assign entriesMapList = []>
427 <#foreach elem in textCarruselImatges2.elementsFieldSetAlt.getSiblings()>
428 <#if elem.elementsFieldSetFieldSetAlt.order?has_content>
429 <#assign currentOrder = elem.elementsFieldSetFieldSetAlt.order.getData()>
430 </#if>
431 <#if !currentOrder?has_content || currentOrder == "null">
432 <#assign currentOrder = "99">
433 </#if>
434 <#assign currEntryMap = {"entry" : elem.elementsFieldSetFieldSetAlt , "order" : currentOrder?number}>
435 <#assign entriesMapList = entriesMapList + [currEntryMap]>
436 </#foreach>
437
438 <#assign sortedEntriesMapList = entriesMapList?sort_by("order")>
439 <#assign sortedEntriesRootElems = []>
440
441 <#foreach currEntryMap in sortedEntriesMapList>
442 <#assign sortedEntriesRootElems = sortedEntriesRootElems + [currEntryMap.entry]>
443 </#foreach>
444
445 <#assign leftContent = "">
446 <#if textCarruselImatges2.titleHeaderAlt?? && textCarruselImatges2.titleHeaderAlt.getData()?has_content && textCarruselImatges2.descHeaderAlt?? && textCarruselImatges2.descHeaderAlt?has_content>
447 <#assign leftContent = "true">
448 </#if>
449
450 <div class="full-body__container hero-carousel-new hero-carousel hero-carousel--super hero-carousel-banner-alt <#if !leftContent?has_content>hero-carousel-banner-solo</#if>">
451 <#if leftContent?has_content>
452 <div class="hero-carousel__container-banner">
453 <h2 class="hero-carousel-banner-alt-title">
454 ${textCarruselImatges2.titleHeaderAlt.getData()}
455 </h2>
456 <p class="hero-carousel-banner-alt-desc">
457 ${textCarruselImatges2.descHeaderAlt.getData()}
458 </p>
459 </div>
460 </#if>
461 <div aria-live="polite" aria-atomic="false" aria-relevant="all" class="slick-list draggable">
462 <div class="hero-carousel__container js-carousel-banner-al_alt is-playing"
463 data-prev-text='<@liferay.language key="label.carousel.prev"/>'
464 data-next-text='<@liferay.language key="label.carousel.next"/>'
465 data-pagination-text='<@liferay.language key="label.carousel.outstanding"/>'
466 data-stop-text='<@liferay.language key="label.carousel.pause"/>'
467 data-play-text='<@liferay.language key="label.carousel.start"/>'>
468 <#if sortedEntriesRootElems?has_content>
469 <#foreach element in sortedEntriesRootElems>
470 <div class="hero hero--super">
471 <div class="hero__container">
472 <#if element.typeLinkAlt.getData() == "video">
473 <a href="#" onclick='showVideoModalBanner(`${element.External_LinkAlt.getData()}`);return false;' class="hero__link" <#if element.titleLinkAlt?? && element.titleLinkAlt.getData()?has_content>title="${element.titleLinkAlt.getData()}"</#if>>
474 <#else>
475 <a class="hero__link" <#if element.titleLinkAlt?? && element.titleLinkAlt.getData()?has_content>title="${element.titleLinkAlt.getData()}"</#if> <#if element.typeLinkAlt.getData() == "extern"> href="${element.External_LinkAlt.getData()}" target="_blank" <#elseif element.typeLinkAlt.getData() == "intern" && element.Internal_Link?? && element.Internal_Link.getFriendlyUrl()?has_content> href="${element.Internal_Link.getFriendlyUrl()}" target="_self" <#elseif element.typeLinkAlt.getData() == "intern" && element.External_LinkAlt?? && element.External_LinkAlt.getData()?has_content> href="${element.External_LinkAlt.getData()}" target="_self" </#if>>
476 </#if>
477 <div class="hero__media <#if (!element.titleElemAlt?? || !element.titleElemAlt.getData()?has_content) && (!element.descElemAlt?? || !element.descElemAlt.getData()?has_content)>hero__media-no-fade</#if>">
478 <#if element.typeLinkAlt.getData() == "video">
479 <div class="hero__media-video__container">
480 <span class="hero__media-video__img">
481 </span>
482 </div>
483 </#if>
484 <img class="hero__image hero__image-new lazyload" data-src="${element.imageAlt.getData()}" <#if element.altImage?? && element.altImage.getData()?has_content>alt="${element.altImage.getData()}"</#if>>
485 </div>
486 <div class="hero__content white__banner">
487 <p class="hero__title" >
488 ${element.titleElemAlt.getData()}
489 <#if element.typeLinkAlt.getData() == "extern">
490 <span class="window-warning">
491 <img class="window-warning__icon" src="${imagesFolder}/basic/16px/png/icone-obrir-fora-blanc-16x16.png" alt="<@liferay.language key="label.externalLink.alt"/>" title="<@liferay.language key="label.externalLink.title"/>">
492 </span>
493 </#if>
494 </p>
495 <p class="hero__desc-alt" >
496 ${element.descElemAlt.getData()}
497 </p>
498 </div>
499 </a>
500 </div>
501 </div>
502 </#foreach>
503 </#if>
504 </div>
505 </div>
506 </div>
507
508 <div class="dialog">
509 <div id="carrusel-banner-video" class="u-hidden">
510 <div class="dialog__body dialog__body--jotmbe" id="carrusel-banner-video-content">
511 </div>
512 </div>
513 </div>
514 <script type="text/javascript">
515 initSliderCarruselBanner2();
516
517 function initSliderCarruselBanner2() {
518 if($(".js-carousel-banner-al_alt").hasClass('slick-initialized')) {
519 $(".js-carousel-banner-al_alt").slick("unslick");
520 }
521 $('.js-carousel-banner-al_alt .slick-toggle-play').remove();
522 $('.js-carousel-banner-al_alt').slick({
523 slidesToShow: 1,
524 arrows: true,
525 draggable: true,
526 infinite: false,
527 variableWidth: false,
528 autoplaySpeed: 4000,
529 dots: true,
530 nextArrow: '<button type="button" class="slick-next"><img class="slick-next__icon slick-next__icon-normal" src="${imagesFolder}/basic/18px/svg/arrow-next-black.svg" alt=\'<@liferay.language key="label.next"/>\'/><img class="slick-next__icon slick-next__icon-disabled" src="${imagesFolder}/basic/18px/svg/arrow-next-gray.svg" alt=\'<@liferay.language key="label.next"/>\'/></button>',
531 prevArrow: '<button type="button" class="slick-prev"><img class="slick-prev__icon slick-prev__icon-normal" src="${imagesFolder}/basic/18px/svg/arrow-prev-black.svg" alt=\'<@liferay.language key="label.prev"/>\'/><img class="slick-prev__icon slick-prev__icon-disabled" src="${imagesFolder}/basic/18px/svg/arrow-prev-gray.svg" alt=\'<@liferay.language key="label.prev"/>\'/></button>',
532 responsive: [
533 {
534 breakpoint: 767,
535 settings: {
536 slidesToShow: 1,
537 arrows: false,
538 variableWidth: true,
539 dots: true
540 }
541 }
542 ]
543 }).each(function () {
544 var carousel = $(this),
545 toggleButton,
546 toggleIcon;
547
548 carousel.find('.slick-next__icon').attr({
549 'alt': carousel.data('next-text')
550 });
551
552 carousel.find('.slick-prev__icon').attr({
553 'alt': carousel.data('prev-text')
554 });
555 });
556
557 if ($('.hero-carousel__container .hero').length == 1) {
558 $('.hero-carousel__container .slick-toggle-play').hide();
559 }
560
561 $('.slick-cloned[aria-describedby]').removeAttr('aria-describedby');
562 if($(".js-carousel-banner-al_alt .slick-dots").length > 0) {
563 setDotsPositionBanner2();
564 }
565 }
566
567 function showVideoModalBanner2(link) {
568 const start = link.indexOf("v=") + 2;
569 const end = start + 2 + 11;
570
571 TMB.dialog.newModal(langJotmbeClose, "dialog--jotmbe__no-footer dialog--jotmbe__no-icon dialog--jotmbe__with-actions dialog-video-iframe", "carrusel-banner-video", "");
572 $('#carrusel-banner-video-content').html('<iframe class="home-carrusel-video-iframe" src="https://www.youtube.com/embed/'+link.substring(start, end)+'" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>');
573 }
574 function setDotsPositionBanner2() {
575 $(".js-carousel-banner-al_alt .slick-dots").appendTo($(".js-carousel-banner-al_alt").parent());
576 }
577
578 window.addEventListener('resize', function(event){
579 const width = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth;
580 if($(".js-carousel-banner-al_alt .slick-dots").length > 0 && width > 768) {
581 setDotsPositionBanner2();
582 }
583 });
584
585 </script>
586</#if>
587
588
589<#-- CARRUSEL-TRES-CARD -->
590
591<#if referencesFieldSet?? && 0 < referencesFieldSet.getSiblings()?size && referencesFieldSet.getSiblings()[0].referenceId.getData()?has_content && (!hideTresCards?? || !getterUtil.getBoolean(hideTresCards.getData()))>
592 <#assign colorClass = "" />
593 <#assign fullBody = "" />
594 <#if fondoColorCarruselCards?? && fondoColorCarruselCards.getData()??>
595 <#if fondoColorCarruselCards.getData()=="blanc">
596 <#assign colorClass = "hola-bcn-carrusel-standard--white" />
597 <#assign fullBody = "full-body__container" />
598 <#else>
599 <#assign colorClass = "hola-bcn-carrusel-standard--gray" />
600 <#assign fullBody = "full-body__container" />
601 </#if>
602 </#if>
603
604 <section class="hola-bcn-carrusel-standard ${colorClass}">
605 <div class="hola-bcn-carrusel-standard-cont-ext hola-bcn-carrusel-standard-cont-ext-extra hola-bcn-carrusel-standard-cont-ext-flex ${fullBody}">
606 <div class="hola-bcn-carrusel-standard--container">
607 <div class="hola-bcn-carrusel-standard--outer">
608 <div class="hola-bcn-carrusel-standard_new-header">
609 <h2 class="title title--1 hola-bcn-carrusel-standard__title hola-bcn-carrusel-standard__title_new">${titleCarruselCards.getData()}</h2>
610 <p class="hola-bcn-carrusel-standard__intro-text">${subtitleCarruselCards.getData()}</p>
611 </div>
612 <ul id="result-list" class="hola-bcn-carrusel-standard__items js__hola-bcn-standard-slider">
613 <#assign tmbGroupId = 20182>
614 <#assign fundacioGroupId = 79790>
615 <#list referencesFieldSet.getSiblings() as element>
616 <#assign JournalArticleLocalService = serviceLocator.findService("com.liferay.journal.service.JournalArticleLocalService")>
617 <#assign articleId = element.referenceId.getData()>
618 <#assign groupId = getterUtil.getLong(groupId)>
619 <#attempt>
620 <#assign journalArticle = JournalArticleLocalService.getArticle(groupId, articleId) />
621 <#recover>
622 <#if groupId == tmbGroupId>
623 <#assign groupId = fundacioGroupId>
624 <#else>
625 <#assign groupId = tmbGroupId>
626 </#if>
627 <#attempt>
628 <#assign journalArticle = JournalArticleLocalService.getArticle(groupId, articleId)!>
629 <#recover>
630 <#assign journalArticle = "">
631 </#attempt>
632 </#attempt>
633 <#if journalArticle?has_content && journalArticle != "">
634 <#assign document = saxReaderUtil.read(journalArticle.getContent())>
635 <#assign rootElement = document.getRootElement()>
636
637 <#assign resourceprimKey = journalArticle.getResourcePrimKey()>
638 <#assign assetEntry = assetEntryLocalService.getEntry("com.liferay.journal.model.JournalArticle", resourceprimKey)>
639 <#assign assetRenderer = assetEntry.getAssetRenderer()>
640 <#assign articleURL = assetRenderer.getURLViewInContext(renderRequest, renderResponse, "")>
641 <#assign articleFriendlyURL = assetRenderer.getUrlTitle()>
642 <#assign newwindow = "">
643 <#if !articleURL?has_content>
644 <#assign newwindow = "target='_blank'">
645 <#if !isFundacio>
646 <#if currentURL?contains("pre3")>
647 <#assign articleURL = "https://pre3-fundacio.tmb.cat/" + locale.getLanguage() + "/w/" + articleFriendlyURL>
648 <#else>
649 <#assign articleURL = "https://fundacio.tmb.cat/" + locale.getLanguage() + "/w/" + articleFriendlyURL>
650 </#if>
651 <#else>
652 <#if currentURL?contains("pre3")>
653 <#assign articleURL = "https://pre3.tmb.cat/" + locale.getLanguage() + "/w/" + articleFriendlyURL>
654 <#else>
655 <#assign articleURL = "https://www.tmb.cat/" + locale.getLanguage() + "/w/" + articleFriendlyURL>
656 </#if>
657 </#if>
658 </#if>
659
660 <#assign title = "">
661 <#assign titleSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='titleGlobal']/dynamic-content[@language-id='" + locale + "']")>
662 <#if titleSel.selectSingleNode(rootElement)?has_content>
663 <#assign title = titleSel.selectSingleNode(rootElement).getStringValue()>
664 </#if>
665
666 <#assign subtitle = "">
667 <#assign subtitleSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='subtitleGlobal']/dynamic-content[@language-id='" + locale + "']")>
668 <#if subtitleSel.selectSingleNode(rootElement)?has_content>
669 <#assign subtitle = subtitleSel.selectSingleNode(rootElement).getStringValue()>
670 </#if>
671
672 <#assign initDateNovetatAgenda = "">
673 <#assign fromInitDateNovetatAgenda = "">
674 <#assign endDateNovetatAgenda = "">
675 <#assign whereNovetatAgenda = "">
676 <#assign novetatAgendaSel = rootElement.selectSingleNode("dynamic-element[@field-reference='blocInfoAgenda']")!"">
677 <#if novetatAgendaSel?has_content>
678 <#assign dateNovetatAgendaSelSel = novetatAgendaSel.selectSingleNode("dynamic-element[@field-reference='whenBlocInfoAgenda']")!"">
679
680 <#if dateNovetatAgendaSelSel?has_content && dateNovetatAgendaSelSel.selectSingleNode("dynamic-element[@field-reference='initDateBlocInfoAgenda']/dynamic-content[@language-id='" + locale + "']")?has_content>
681 <#assign initDateNovetatAgenda = dateNovetatAgendaSelSel.selectSingleNode("dynamic-element[@field-reference='initDateBlocInfoAgenda']/dynamic-content[@language-id='" + locale + "']").getStringValue()>
682 </#if>
683
684 <#if dateNovetatAgendaSelSel?has_content && dateNovetatAgendaSelSel.selectSingleNode("dynamic-element[@field-reference='fromInitDateBlocInfoAgenda']/dynamic-content[@language-id='" + locale + "']")?has_content>
685 <#assign fromInitDateNovetatAgenda = dateNovetatAgendaSelSel.selectSingleNode("dynamic-element[@field-reference='fromInitDateBlocInfoAgenda']/dynamic-content[@language-id='" + locale + "']").getStringValue()>
686 </#if>
687
688 <#if dateNovetatAgendaSelSel?has_content && dateNovetatAgendaSelSel.selectSingleNode("dynamic-element[@field-reference='endDateBlocInfoAgenda']/dynamic-content[@language-id='" + locale + "']")?has_content>
689 <#assign endDateNovetatAgenda = dateNovetatAgendaSelSel.selectSingleNode("dynamic-element[@field-reference='endDateBlocInfoAgenda']/dynamic-content[@language-id='" + locale + "']").getStringValue()>
690 </#if>
691
692 <#assign whereNovetatAgendaSelSel = novetatAgendaSel.selectSingleNode("dynamic-element[@field-reference='whereBlocInfoAgenda']")!"">
693 <#if whereNovetatAgendaSelSel?has_content && whereNovetatAgendaSelSel.selectSingleNode("dynamic-element[@field-reference='textWhereBlocInfoAgenda']/dynamic-content[@language-id='" + locale + "']")?has_content>
694 <#assign whereNovetatAgenda = whereNovetatAgendaSelSel.selectSingleNode("dynamic-element[@field-reference='textWhereBlocInfoAgenda']/dynamic-content[@language-id='" + locale + "']").getStringValue()>
695 </#if>
696 </#if>
697
698 <#assign typeNovetatAgenda = "">
699 <#assign typeNovetatAgendaSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='typeNovetatAgenda']/dynamic-content[@language-id='" + locale + "']")>
700 <#if typeNovetatAgendaSel.selectSingleNode(rootElement)?has_content>
701 <#assign typeNovetatAgenda = typeNovetatAgendaSel.selectSingleNode(rootElement).getStringValue()>
702 </#if>
703
704 <#assign filterNovetatAgenda = "">
705 <#assign filterNovetatAgendaSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='filterNovetatAgenda']/dynamic-content[@language-id='" + locale + "']")>
706 <#if filterNovetatAgendaSel.selectSingleNode(rootElement)?has_content>
707 <#assign filterNovetatAgenda = filterNovetatAgendaSel.selectSingleNode(rootElement).getStringValue()>
708 </#if>
709
710 <#assign imageNovetatAgenda = "">
711 <#assign imageNovetatAgendaSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='imageCardNovetatAgenda']/dynamic-content[@language-id='" + locale + "']")>
712 <#if imageNovetatAgendaSel.selectSingleNode(rootElement)?has_content>
713 <#assign image = imageNovetatAgendaSel.selectSingleNode(rootElement).getStringValue()>
714 <#assign imageUuid = jsonFactoryUtil.createJSONObject(image).uuid!"">
715 <#assign imageNovetatAgenda = themeDisplay.getPortalURL() + themeDisplay.getPathContext() + "/documents/" + groupId + "/" + imageUuid>
716 </#if>
717
718 <#assign imageAltNovetatAgenda = "">
719 <#assign imageAltNovetatAgendaSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='altImageCardNovetatAgenda']/dynamic-content[@language-id='" + locale + "']")>
720 <#if imageAltNovetatAgendaSel.selectSingleNode(rootElement)?has_content>
721 <#assign imageAltNovetatAgenda = imageAltNovetatAgendaSel.selectSingleNode(rootElement).getStringValue()>
722 </#if>
723
724 <#assign pubDateNovetatAgenda = "">
725 <#assign pubDateNovetatAgendaSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='pubDateNovetatAgenda']/dynamic-content[@language-id='" + locale + "']")>
726 <#if pubDateNovetatAgendaSel.selectSingleNode(rootElement)?has_content>
727 <#assign pubDateNovetatAgenda = pubDateNovetatAgendaSel.selectSingleNode(rootElement).getStringValue()>
728 </#if>
729
730 <#assign pubTimeNovetatAgenda = "">
731 <#assign pubTimeNovetatAgendaSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='pubTimeNovetatAgenda']/dynamic-content[@language-id='" + locale + "']")>
732 <#if pubTimeNovetatAgendaSel.selectSingleNode(rootElement)?has_content>
733 <#assign pubTimeNovetatAgenda = pubTimeNovetatAgendaSel.selectSingleNode(rootElement).getStringValue()>
734 </#if>
735
736 <#assign despubDateNovetatAgenda = "">
737 <#assign despubDateNovetatAgendaSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='despubDateNovetatAgenda']/dynamic-content[@language-id='" + locale + "']")>
738 <#if despubDateNovetatAgendaSel.selectSingleNode(rootElement)?has_content>
739 <#assign despubDateNovetatAgenda = despubDateNovetatAgendaSel.selectSingleNode(rootElement).getStringValue()>
740 </#if>
741
742 <#assign despubTimeNovetatAgenda = "">
743 <#assign despubTimeNovetatAgendaSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='despubTimeNovetatAgenda']/dynamic-content[@language-id='" + locale + "']")>
744 <#if despubTimeNovetatAgendaSel.selectSingleNode(rootElement)?has_content>
745 <#assign despubTimeNovetatAgenda = despubTimeNovetatAgendaSel.selectSingleNode(rootElement).getStringValue()>
746 </#if>
747
748 <#assign isExpiredNovetatAgenda = "">
749 <#assign isExpiredNovetatAgendaSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='isExpiredNovetatAgenda']/dynamic-content[@language-id='" + locale + "']")>
750 <#if isExpiredNovetatAgendaSel.selectSingleNode(rootElement)?has_content>
751 <#assign isExpiredNovetatAgenda = isExpiredNovetatAgendaSel.selectSingleNode(rootElement).getStringValue()>
752 </#if>
753
754 <#assign isPublishedNA = false>
755 <#if (pubDateNovetatAgenda?has_content)>
756 <#if pubTimeNovetatAgenda?has_content>
757 <#assign timeActDate = pubTimeNovetatAgenda?date["HH:mm"]>
758 <#assign timeActFormat = timeActDate?string["HH:mm"]>
759 <#else>
760 <#assign timeActDate = "">
761 <#assign timeActFormat = "">
762 </#if>
763 <#attempt>
764 <#assign dataAct = pubDateNovetatAgenda?date["yyyy-MM-dd"]>
765
766 <#if timeActFormat?has_content && timeActFormat != "">
767 <#assign dataActMil = miliSeconds(timeActFormat dataAct?long)>
768 <#assign dataAct = dateUtil.newDate(getterUtil.getLong(dataActMil))>
769 </#if>
770 <#assign dataActMil = dataAct?long>
771 <#assign now = .now?long+timeZoneUtil.getTimeZone("Europe/Madrid").getOffset(.now?long)>
772 <#assign isPublishedNA = (dataActMil - now ) < 0 />
773 <#recover>
774 </#attempt>
775 </#if>
776
777 <#assign isDespublishedNA = false>
778 <#if (despubDateNovetatAgenda?has_content)>
779 <#if despubTimeNovetatAgenda?has_content>
780 <#assign timeExpDate = despubTimeNovetatAgenda?date["HH:mm"]>
781 <#assign timeExpFormat = timeExpDate?string["HH:mm"]>
782 <#else>
783 <#assign timeExpDate = "">
784 <#assign timeExpFormat = "">
785 </#if>
786 <#attempt>
787 <#assign dataExp = despubDateNovetatAgenda?date["yyyy-MM-dd"]>
788
789 <#if timeExpFormat?has_content && timeExpFormat != "">
790 <#assign dataExpMil = miliSeconds(timeExpFormat dataExp?long)>
791 <#assign dataExp = dateUtil.newDate(getterUtil.getLong(dataExpMil))>
792 </#if>
793 <#assign dataExpMil = dataExp?long>
794 <#assign now = .now?long+timeZoneUtil.getTimeZone("Europe/Madrid").getOffset(.now?long)>
795 <#assign isDespublishedNA = (dataExpMil - now) < 0 />
796 <#recover>
797 </#attempt>
798 </#if>
799
800 <#assign isExpiredNA = false>
801 <#if journalArticle.expirationDate??>
802 <#assign dataExp = journalArticle.expirationDate?datetime>
803 <#attempt>
804 <#assign dataExpMil = dataExp?long>
805 <#assign now = .now?long+timeZoneUtil.getTimeZone("Europe/Madrid").getOffset(.now?long)>
806 <#assign isExpiredNA = (dataExpMil - now) < 0 />
807 <#recover>
808 </#attempt>
809 </#if>
810
811 <#assign showNovetatAgenda = false>
812 <#if typeNovetatAgenda?has_content && typeNovetatAgenda == "1">
813 <#assign showNovetatAgenda = isPublishedNA && !isExpiredNA && !isDespublishedNA && isExpiredNovetatAgenda != "true">
814 <#else>
815 <#assign showNovetatAgenda = isPublishedNA && !isExpiredNA && isExpiredNovetatAgenda != "true">
816 </#if>
817
818 <#if showNovetatAgenda>
819 <#if title?has_content>
820 <li class="hola-bcn-carrusel-standard_new-li">
821 <a ${newwindow} class="hola-bcn-carrusel-standard_new <#if isDespublishedNA>hola-bcn-carrusel-standard_new-finished</#if>" href="${articleURL}">
822 <div class="hola-bcn-carrusel-standard__card-cover">
823 <div class="hola-bcn-carrusel-standard__card-cover-filter"></div>
824 <img class="hola-bcn-carrusel-standard__image" src="${imageNovetatAgenda}" <#if imageAltNovetatAgenda?has_content>alt="${imageAltNovetatAgenda}"<#else>alt=""</#if>>
825 <div class="hola-bcn-carrusel-standard-finished-text" <#if isDespublishedNA>style="display: block;"</#if>>
826 <span><@liferay.language key='label.bloc.novetatagenda.finished' /></span>
827 </div>
828 <#if filterNovetatAgenda?has_content>
829 <div class="hola-bcn-carrusel-standard-highlight">
830 <span><@liferay.language key='label.bloc.novetatagenda.filter.${filterNovetatAgenda}' /></span>
831 </div>
832 </#if>
833 </div>
834 <div class="hola-bcn-carrusel-standard-container">
835 <div>
836 <h3 class="hola-bcn-carrusel-standard__card-title">
837 ${title}
838 <#if newwindow?? && newwindow?has_content>
839 <span class="icon-external-black" alt="Enllaç extern" title="(Obre una nova finestra)"></span>
840 </#if>
841 </h3>
842 <span class="hola-bcn-carrusel-standard__card-description">
843 ${subtitle}
844 </span>
845 </div>
846 <#if initDateNovetatAgenda?has_content || endDateNovetatAgenda?has_content || (whereNovetatAgenda?has_content)>
847 <div class="hola-bcn-carrusel-standard_bottom-extra">
848 <#if initDateNovetatAgenda?has_content || endDateNovetatAgenda?has_content>
849 <div class="hola-bcn-carrusel-standard-date">
850 <#if fromInitDateNovetatAgenda == "true">
851 <span><b><@liferay.language key='label.bloc.novetatagenda.when' /></b> <@liferay.language key='label.bloc.novetatagenda.from' /> ${initDateNovetatAgenda?date["yyyy-MM-dd"]?string("dd/MM/yyyy")}</span>
852 <#else>
853 <span><b><@liferay.language key='label.bloc.novetatagenda.when' /></b> <@liferay.language key='label.bloc.novetatagenda.from' /> ${initDateNovetatAgenda?date["yyyy-MM-dd"]?string("dd/MM/yyyy")}<#if endDateNovetatAgenda?has_content> <@liferay.language key='label.bloc.novetatagenda.to' /> ${endDateNovetatAgenda?date["yyyy-MM-dd"]?string("dd/MM/yyyy")}</#if></span>
854 </#if>
855 </div>
856 </#if>
857 <#if whereNovetatAgenda?has_content>
858 <div class="hola-bcn-carrusel-standard-where">
859 <span><b><@liferay.language key='label.bloc.novetatagenda.where' /> <span class="hola-bcn-carrusel-standard-where-inner">${whereNovetatAgenda}</span></b></span>
860 </div>
861 </#if>
862 </div>
863 </#if>
864 </div>
865 </a>
866 </li>
867 </#if>
868 </#if>
869 </#if>
870 </#list>
871 </ul>
872 </div>
873 </div>
874 </div>
875 </section>
876
877 <script type="text/javascript">
878
879 $(document).ready(function() {
880 initSliderBcnStandard();
881 });
882
883 function initSliderBcnStandard() {
884 if($(".js__hola-bcn-standard-slider").hasClass('slick-initialized')) {
885 $(".js__hola-bcn-standard-slider").slick("unslick");
886 }
887
888 $('.js__hola-bcn-standard-slider').slick({
889 slidesToShow: 3,
890 slidesToScroll: 1,
891 arrows: false,
892 dots: false,
893 draggable: false,
894 infinite: false,
895 responsive: [
896 {
897 breakpoint: 767,
898 settings: {
899 variableWidth: true,
900 slidesToShow: 2,
901 slidesToScroll: 1,
902 arrows: false,
903 dots: true,
904 draggable: true,
905 infinite: true
906 }
907 }
908 ]
909 });
910 }
911
912 </script>
913</#if>

Et trobes a:
eDreams Mitja Marató Barcelona
T'expliquem com arribar-hi!
Quan: 16.02.2025
On: Parc de la Ciutadella
Si participes a l'eDreams Mitja Marató Barcelona, arriba-hi amb transport públic. A TMB t'hi portem.
Recomanem accedir al punt de sortida amb metro. Pots fer-ho des de les estacions Arc de Triomf (L1) i Ciutadella - Vila Olímpica (L4).
Consulta les afectacions al servei de bus i les recomanacions de transport.
Consulta Vull anar per altres opcions de transport.
Important! Tingues present que les curses de gran magnitud ocasionen afectacions al trasport de superfície de la ciutat. Consulta l'estat de la xarxa de transport públic abans de sortir de casa.

Bitllet de transport exclusiu
Per a aquesta edició, s'han editat 30.000 bitllest senzills, que s'incloen en a la bossa del corredor.
TMB, amb els grans esdeveniments de la ciutat
L'eDreams Mitja Marató Barcelona, amb 30.000 participants, és una de les curses més importants que es celebren anualment a la ciutat.
TMB, com a principal operador de transport públic de Barcelona i la seva àrea metropolitana, treball en l'impacte que una celebració d'aquesta magnitud pot tenir a la xarxa de trasport. A més a més, també s'implica de forma activa amb els esdeveniments, sent-hi present de forma latent i col·laborant-hi a nivell logístic i de marca.
Vés-hi amb TMB App!
Dissenya la teva ruta, configura les alertes dels transports que necessitis i arriba a la cursa sense sorpreses!
-
FinalitzatCampanya
Quan viatgis en metro, fes-ho de manera segura
Nosaltres vetllem per la teva seguretat, tu evites accions que posen en perill la teva integritat i el bon funcionament del servei. -
FinalitzatCampanya
Posa't a la seva pell, no al seu lloc
Respecta la prioritat absoluta al transport públic. -
FinalitzatCampanya
Sempre hi som
El metro i els busos tenen càmeres de videovigilància en temps real perquè viatgis amb seguretat.
The following has evaluated to null or missing: ==> detallAgenda.elementsDetallAgenda.getSiblings()[0].titleDetallAgenda [in template "20155#20195#1501272" at line 308, column 85] ---- Tip: It's the step after the last dot that caused this error, not those before it. ---- Tip: If the failing expression is known to legally refer to something that's sometimes null or missing, either specify a default value like myOptionalVar!myDefault, or use <#if myOptionalVar??>when-present<#else>when-missing</#if>. (These only cover the last step of the expression; to cover the whole expression, use parenthesis: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)?? ---- ---- FTL stack trace ("~" means nesting-related): - Failed at: #if detallAgenda?? && 0 < detallAgend... [in template "20155#20195#1501272" at line 308, column 1] ----
1<#assign imagesFolder = themeDisplay.getPathThemeImages()>
2<#assign assetEntryLocalService = serviceLocator.findService("com.liferay.asset.kernel.service.AssetEntryLocalService")>
3<#assign currentURL = request.getRequestURL() />
4<#assign isFundacio = false>
5<#if currentURL?contains("fundacio")>
6 <#assign isFundacio = true>
7</#if>
8
9<#function miliSeconds dateString firstDate>
10 <#assign params = dateString?split(":")>
11
12 <#if params?size == 2>
13 <#assign param1 = params[0]>
14 <#assign param2 = params[1]>
15 <#assign param1 = getterUtil.getLong(param1)*3600000>
16 <#assign param2 = getterUtil.getLong(param2)*60000>
17 <#assign finalMilSec = param1 + param2>
18 <#assign finalMilSecLong = getterUtil.getLong(finalMilSec)>
19 <#assign resultLong = firstDate + finalMilSecLong>
20
21 <#return resultLong>
22 </#if>
23</#function>
24
25<#-- header-image -->
26
27<#if upperImage?? && upperImage.getData()?has_content>
28 <div class="header-image">
29 <img src="${upperImage.getData()}" <#if upperImageAlt?? && upperImageAlt.getData()?has_content>alt="${upperImageAlt.getData()}"</#if>>
30 </div>
31</#if>
32
33
34<#-- breadcrumbs -->
35
36<div class="full-body__container breadcrumbs" style="float: unset; margin-right: auto; padding-bottom: 22px; padding-top: 22px;">
37 <p class="breadcrumbs__title"><@liferay.language key='header.breadcrumbs.text' />:</p>
38 <#if liferay_portlet?has_content><@liferay.breadcrumbs /></#if>
39</div>
40
41
42<#-- TITOL I SUBTITOL -->
43
44<#if titleGlobal?? && titleGlobal.getData()?has_content || subtitleGlobal?? && subtitleGlobal.getData()?has_content>
45 <div class="full-body__container basicav2-titol-subtitol">
46 <#if titleGlobal?? && titleGlobal.getData()?has_content><h1>${titleGlobal.getData()}</h1></#if>
47 <#if subtitleGlobal?? && subtitleGlobal.getData()?has_content><p>${subtitleGlobal.getData()}</p></#if>
48 </div>
49</#if>
50
51
52<#-- bloc-info-agenda -->
53
54<#if blocInfoAgenda?? && ((blocInfoAgenda.whenBlocInfoAgenda.initDateBlocInfoAgenda?? && blocInfoAgenda.whenBlocInfoAgenda.initDateBlocInfoAgenda.getData()?has_content) || (blocInfoAgenda.whereBlocInfoAgenda.textWhereBlocInfoAgenda?? && blocInfoAgenda.whereBlocInfoAgenda.textWhereBlocInfoAgenda.getData()?has_content) || (blocInfoAgenda.accesBlocInfoAgenda.textAccesBlocInfoAgenda?? && blocInfoAgenda.accesBlocInfoAgenda.textAccesBlocInfoAgenda.getData()?has_content)) && (!blocInfoAgenda.hideBlocInfoAgenda?? || !getterUtil.getBoolean(blocInfoAgenda.hideBlocInfoAgenda.getData()))>
55 <div class="full-body__container bloc-info-agenda">
56 <div class="bloc-info-agenda-elements">
57 <#if blocInfoAgenda.whenBlocInfoAgenda.initDateBlocInfoAgenda?? && blocInfoAgenda.whenBlocInfoAgenda.initDateBlocInfoAgenda.getData()?has_content>
58 <div class="bloc-info-agenda-element">
59 <#if blocInfoAgenda.whenBlocInfoAgenda.imageWhenBlocInfoAgenda?? && blocInfoAgenda.whenBlocInfoAgenda.imageWhenBlocInfoAgenda.getData()?has_content>
60 <img class="bloc-info-agenda-img" src="${blocInfoAgenda.whenBlocInfoAgenda.imageWhenBlocInfoAgenda.getData()}">
61 <#else>
62 <img class="bloc-info-agenda-img" src="${imagesFolder}/basic/24px/svg/calendar.svg">
63 </#if>
64 <#if blocInfoAgenda.whenBlocInfoAgenda.fromInitDateBlocInfoAgenda?? && blocInfoAgenda.whenBlocInfoAgenda.fromInitDateBlocInfoAgenda.getData()?has_content && getterUtil.getBoolean(blocInfoAgenda.whenBlocInfoAgenda.fromInitDateBlocInfoAgenda.getData())>
65 <div class="bloc-info-agenda-text"><p><@liferay.language key="label.bloc.novetatagenda.when"/> <b><@liferay.language key='label.bloc.novetatagenda.from' /> ${blocInfoAgenda.whenBlocInfoAgenda.initDateBlocInfoAgenda.getData()?date["yyyy-MM-dd"]?string("dd.MM.yyyy")}</b></p></div>
66 <#else>
67 <div class="bloc-info-agenda-text"><p><@liferay.language key="label.bloc.novetatagenda.when"/> <b>${blocInfoAgenda.whenBlocInfoAgenda.initDateBlocInfoAgenda.getData()?date["yyyy-MM-dd"]?string("dd.MM.yyyy")}<#if blocInfoAgenda.whenBlocInfoAgenda.endDateBlocInfoAgenda?? && blocInfoAgenda.whenBlocInfoAgenda.endDateBlocInfoAgenda.getData()?has_content> <@liferay.language key="label.bloc.novetatagenda.to"/> ${blocInfoAgenda.whenBlocInfoAgenda.endDateBlocInfoAgenda.getData()?date["yyyy-MM-dd"]?string("dd.MM.yyyy")}</#if></b></p></div>
68 </#if>
69 </div>
70 <hr>
71 </#if>
72 <#if blocInfoAgenda.whereBlocInfoAgenda.textWhereBlocInfoAgenda?? && blocInfoAgenda.whereBlocInfoAgenda.textWhereBlocInfoAgenda.getData()?has_content>
73 <div class="bloc-info-agenda-element">
74 <#if blocInfoAgenda.whereBlocInfoAgenda.imageWhereBlocInfoAgenda?? && blocInfoAgenda.whereBlocInfoAgenda.imageWhereBlocInfoAgenda.getData()?has_content>
75 <img class="bloc-info-agenda-img" src="${blocInfoAgenda.whereBlocInfoAgenda.imageWhereBlocInfoAgenda.getData()}">
76 <#else>
77 <img class="bloc-info-agenda-img" src="${imagesFolder}/basic/24px/svg/location_on.svg">
78 </#if>
79 <div class="bloc-info-agenda-text"><p><@liferay.language key="label.bloc.novetatagenda.where"/> <b>${blocInfoAgenda.whereBlocInfoAgenda.textWhereBlocInfoAgenda.getData()}</b></p></div>
80 </div>
81 <hr>
82 </#if>
83 <#if blocInfoAgenda.accesBlocInfoAgenda.textAccesBlocInfoAgenda?? && blocInfoAgenda.accesBlocInfoAgenda.textAccesBlocInfoAgenda.getData()?has_content>
84 <div class="bloc-info-agenda-element">
85 <#if blocInfoAgenda.accesBlocInfoAgenda.imageAccesBlocInfoAgenda?? && blocInfoAgenda.accesBlocInfoAgenda.imageAccesBlocInfoAgenda.getData()?has_content>
86 <img class="bloc-info-agenda-img" src="${blocInfoAgenda.accesBlocInfoAgenda.imageAccesBlocInfoAgenda.getData()}">
87 <#else>
88 <img class="bloc-info-agenda-img" src="${imagesFolder}/basic/24px/svg/ticket.svg">
89 </#if>
90 <div class="bloc-info-agenda-text"><p><@liferay.language key="label.bloc.novetatagenda.acces"/> <b>${blocInfoAgenda.accesBlocInfoAgenda.textAccesBlocInfoAgenda.getData()}</b></p></div>
91 </div>
92 </#if>
93 </div>
94 <#if blocInfoAgenda.textBottomBlocInfoAgenda?? && blocInfoAgenda.textBottomBlocInfoAgenda.getData()?has_content>
95 <div class="bloc-info-agenda-bottom">
96 <span>${blocInfoAgenda.textBottomBlocInfoAgenda.getData()}</span>
97 </div>
98 </#if>
99 </div>
100</#if>
101
102<#-- text-center -->
103
104<#if textCenter?? && textCenter.getData()?has_content>
105 <div class="full-body__container text-center-basic">
106 ${textCenter.getData()}
107 </div>
108</#if>
109
110
111<#-- image-center -->
112
113<#if imageCenter?? && imageCenter.getData()?has_content>
114 <div class="full-body__container image-center-basic">
115 <img src="${imageCenter.getData()}">
116 </div>
117</#if>
118
119
120<#-- TEXT-CARRUSEL-IMATGES -->
121
122<#if textCarruselImatges1?? && 0 < textCarruselImatges1.elementsFieldSet.getSiblings()?size && textCarruselImatges1.elementsFieldSet.getSiblings()[0].elementsFieldSetFieldSet.image?? && textCarruselImatges1.elementsFieldSet.getSiblings()[0].elementsFieldSetFieldSet.image.getData()?has_content && (!textCarruselImatges1.hideTextCarruselImatges?? || !getterUtil.getBoolean(textCarruselImatges1.hideTextCarruselImatges.getData()))>
123 <#assign entriesMapList = []>
124 <#foreach elem in textCarruselImatges1.elementsFieldSet.getSiblings()>
125 <#if elem.elementsFieldSetFieldSet.order?has_content>
126 <#assign currentOrder = elem.elementsFieldSetFieldSet.order.getData()>
127 </#if>
128 <#if !currentOrder?has_content || currentOrder == "null">
129 <#assign currentOrder = "99">
130 </#if>
131 <#assign currEntryMap = {"entry" : elem.elementsFieldSetFieldSet , "order" : currentOrder?number}>
132 <#assign entriesMapList = entriesMapList + [currEntryMap]>
133 </#foreach>
134
135 <#assign sortedEntriesMapList = entriesMapList?sort_by("order")>
136 <#assign sortedEntriesRootElems = []>
137
138 <#foreach currEntryMap in sortedEntriesMapList>
139 <#assign sortedEntriesRootElems = sortedEntriesRootElems + [currEntryMap.entry]>
140 </#foreach>
141
142 <#assign leftContent = "">
143 <#if textCarruselImatges1.titleHeader?? && textCarruselImatges1.titleHeader.getData()?has_content && textCarruselImatges1.descHeader?? && textCarruselImatges1.descHeader?has_content>
144 <#assign leftContent = "true">
145 </#if>
146
147 <div class="full-body__container hero-carousel-new hero-carousel hero-carousel--super hero-carousel-banner-alt <#if !leftContent?has_content>hero-carousel-banner-solo</#if>">
148 <#if leftContent?has_content>
149 <div class="hero-carousel__container-banner">
150 <h2 class="hero-carousel-banner-alt-title">
151 ${textCarruselImatges1.titleHeader.getData()}
152 </h2>
153 <p class="hero-carousel-banner-alt-desc">
154 ${textCarruselImatges1.descHeader.getData()}
155 </p>
156 </div>
157 </#if>
158 <div aria-live="polite" aria-atomic="false" aria-relevant="all" class="slick-list draggable">
159 <div class="hero-carousel__container js-carousel-banner-al_1 is-playing"
160 data-prev-text='<@liferay.language key="label.carousel.prev"/>'
161 data-next-text='<@liferay.language key="label.carousel.next"/>'
162 data-pagination-text='<@liferay.language key="label.carousel.outstanding"/>'
163 data-stop-text='<@liferay.language key="label.carousel.pause"/>'
164 data-play-text='<@liferay.language key="label.carousel.start"/>'>
165 <#if sortedEntriesRootElems?has_content>
166 <#foreach element in sortedEntriesRootElems>
167 <div class="hero hero--super">
168 <div class="hero__container">
169 <#if element.typeLink.getData() == "video">
170 <a href="#" onclick='showVideoModalBanner(`${element.External_Link.getData()}`);return false;' class="hero__link" <#if element.titleLink?? && element.titleLink.getData()?has_content>title="${element.titleLink.getData()}"</#if>>
171 <#else>
172 <a class="hero__link" <#if element.titleLink?? && element.titleLink.getData()?has_content>title="${element.titleLink.getData()}"</#if> <#if element.typeLink.getData() == "extern"> href="${element.External_Link.getData()}" target="_blank" <#elseif element.typeLink.getData() == "intern" && element.Internal_Link?? && element.Internal_Link.getFriendlyUrl()?has_content> href="${element.Internal_Link.getFriendlyUrl()}" target="_self" <#elseif element.typeLink.getData() == "intern" && element.External_Link?? && element.External_Link.getData()?has_content> href="${element.External_Link.getData()}" target="_self" </#if>>
173 </#if>
174 <div class="hero__media <#if (!element.titleElem?? || !element.titleElem.getData()?has_content) && (!element.descElem?? || !element.descElem.getData()?has_content)>hero__media-no-fade</#if>">
175 <#if element.typeLink.getData() == "video">
176 <div class="hero__media-video__container">
177 <span class="hero__media-video__img">
178 </span>
179 </div>
180 </#if>
181 <img class="hero__image hero__image-new lazyload" data-src="${element.image.getData()}" <#if element.altImage?? && element.altImage.getData()?has_content>alt="${element.altImage.getData()}"</#if>>
182 </div>
183 <div class="hero__content white__banner">
184 <p class="hero__title" >
185 ${element.titleElem.getData()}
186 <#if element.typeLink.getData() == "extern">
187 <span class="window-warning">
188 <img class="window-warning__icon" src="${imagesFolder}/basic/16px/png/icone-obrir-fora-blanc-16x16.png" alt="<@liferay.language key="label.externalLink.alt"/>" title="<@liferay.language key="label.externalLink.title"/>">
189 </span>
190 </#if>
191 </p>
192 <p class="hero__desc-alt" >
193 ${element.descElem.getData()}
194 </p>
195 </div>
196 </a>
197 </div>
198 </div>
199 </#foreach>
200 </#if>
201 </div>
202 </div>
203 </div>
204
205 <div class="dialog">
206 <div id="carrusel-banner-video" class="u-hidden">
207 <div class="dialog__body dialog__body--jotmbe" id="carrusel-banner-video-content">
208 </div>
209 </div>
210 </div>
211 <script type="text/javascript">
212 initSliderCarruselBanner1();
213
214 function initSliderCarruselBanner1() {
215 if($(".js-carousel-banner-al_1").hasClass('slick-initialized')) {
216 $(".js-carousel-banner-al_1").slick("unslick");
217 }
218 $('.js-carousel-banner-al_1 .slick-toggle-play').remove();
219 $('.js-carousel-banner-al_1').slick({
220 slidesToShow: 1,
221 arrows: true,
222 draggable: true,
223 infinite: false,
224 variableWidth: false,
225 autoplaySpeed: 4000,
226 dots: true,
227 nextArrow: '<button type="button" class="slick-next"><img class="slick-next__icon slick-next__icon-normal" src="${imagesFolder}/basic/18px/svg/arrow-next-black.svg" alt=\'<@liferay.language key="label.next"/>\'/><img class="slick-next__icon slick-next__icon-disabled" src="${imagesFolder}/basic/18px/svg/arrow-next-gray.svg" alt=\'<@liferay.language key="label.next"/>\'/></button>',
228 prevArrow: '<button type="button" class="slick-prev"><img class="slick-prev__icon slick-prev__icon-normal" src="${imagesFolder}/basic/18px/svg/arrow-prev-black.svg" alt=\'<@liferay.language key="label.prev"/>\'/><img class="slick-prev__icon slick-prev__icon-disabled" src="${imagesFolder}/basic/18px/svg/arrow-prev-gray.svg" alt=\'<@liferay.language key="label.prev"/>\'/></button>',
229 responsive: [
230 {
231 breakpoint: 767,
232 settings: {
233 slidesToShow: 1,
234 arrows: false,
235 variableWidth: true,
236 dots: true
237 }
238 }
239 ]
240 }).each(function () {
241 var carousel = $(this),
242 toggleButton,
243 toggleIcon;
244
245 carousel.find('.slick-next__icon').attr({
246 'alt': carousel.data('next-text')
247 });
248
249 carousel.find('.slick-prev__icon').attr({
250 'alt': carousel.data('prev-text')
251 });
252 });
253
254 if ($('.hero-carousel__container .hero').length == 1) {
255 $('.hero-carousel__container .slick-toggle-play').hide();
256 }
257
258 $('.slick-cloned[aria-describedby]').removeAttr('aria-describedby');
259 if($(".js-carousel-banner-al_1 .slick-dots").length > 0) {
260 setDotsPositionBanner1();
261 }
262 }
263
264 function showVideoModalBanner(link) {
265 const start = link.indexOf("v=") + 2;
266 const end = start + 2 + 11;
267
268 TMB.dialog.newModal(langJotmbeClose, "dialog--jotmbe__no-footer dialog--jotmbe__no-icon dialog--jotmbe__with-actions dialog-video-iframe", "carrusel-banner-video", "");
269 $('#carrusel-banner-video-content').html('<iframe class="home-carrusel-video-iframe" src="https://www.youtube.com/embed/'+link.substring(start, end)+'" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>');
270 }
271 function setDotsPositionBanner1() {
272 $(".js-carousel-banner-al_1 .slick-dots").appendTo($(".js-carousel-banner-al_1").parent());
273 }
274
275 window.addEventListener('resize', function(event){
276 const width = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth;
277 if($(".js-carousel-banner-al_1 .slick-dots").length > 0 && width > 768) {
278 setDotsPositionBanner1();
279 }
280 });
281
282 </script>
283</#if>
284
285
286<#-- BASICA-TITOL-TEXT -->
287
288<#if basicaTitolText?? && 0 < basicaTitolText.elementsBasica.getSiblings()?size && (basicaTitolText.elementsBasica.getSiblings()[0].titleBasica.getData()?has_content || basicaTitolText.elementsBasica.getSiblings()[0].contentBasica.getData()?has_content) && (!basicaTitolText.hideBasicaTitolText?? || !getterUtil.getBoolean(basicaTitolText.hideBasicaTitolText.getData()))>
289 <div class="full-body__container basica-titol-text">
290 <#foreach elem in basicaTitolText.elementsBasica.getSiblings()>
291 <div class="basica-titol-text-wrapper">
292 <#if elem.titleBasica?? && elem.titleBasica.getData()?has_content><h2 class="">${elem.titleBasica.getData()}</h2></#if>
293 <#if elem.contentBasica?? && elem.contentBasica.getData()?has_content><div class="basica-titol-text-content">${elem.contentBasica.getData()}</div></#if>
294 </div>
295 <#foreach subelem in elem.subelementsBasica.getSiblings()>
296 <div class="basica-titol-text-wrapper">
297 <#if subelem.subelementTitleBasica?? && subelem.subelementTitleBasica.getData()?has_content><h3>${subelem.subelementTitleBasica.getData()}</h3></#if>
298 <#if subelem.subelementContentBasica?? && subelem.subelementContentBasica.getData()?has_content><div class="basica-titol-text-content">${subelem.subelementContentBasica.getData()}</div></#if>
299 </div>
300 </#foreach>
301 </#foreach>
302 </div>
303</#if>
304
305
306<#-- bloc-detall-agenda -->
307
308<#if detallAgenda?? && 0 < detallAgenda.elementsDetallAgenda.getSiblings()?size && (detallAgenda.elementsDetallAgenda.getSiblings()[0].titleDetallAgenda.getData()?has_content || detallAgenda.elementsDetallAgenda.getSiblings()[0].contentDetallAgenda.getData()?has_content) && (!detallAgenda.hideDetallAgenda?? || !getterUtil.getBoolean(detallAgenda.hideDetallAgenda.getData()))>
309 <div class="full-body__container detall-agenda">
310 <#foreach elem in detallAgenda.elementsDetallAgenda.getSiblings()>
311 <div class="detall-agenda-wrapper">
312 <#if elem.titleDetallAgenda?? && elem.titleDetallAgenda.getData()?has_content><h2 class="">${elem.titleDetallAgenda.getData()}</h2></#if>
313 <#if elem.contentDetallAgenda?? && elem.contentDetallAgenda.getData()?has_content><div class="detall-agenda-content">${elem.contentDetallAgenda.getData()}</div></#if>
314 </div>
315 </#foreach>
316 <div class="detall-agenda-buttons-wrapper">
317 <#foreach subelem in detallAgenda.buttonsDetallAgenda.getSiblings()>
318 <a title="<#if subelem.accessibleTitleButtons?? && subelem.accessibleTitleButtons.getData()?has_content>${subelem.accessibleTitleButtons.getData()}</#if>" type="button" class="button button--a" <#if subelem.linkTypeDetallAgenda.getData() == "extern" && subelem.External_LinkDetallAgenda?? && subelem.External_LinkDetallAgenda.getData()?has_content> href="${subelem.External_LinkDetallAgenda.getData()}" rel="external" target="_blank" <#elseif subelem.linkTypeDetallAgenda.getData() == "intern" && subelem.Internal_LinkDetallAgenda?? && subelem.Internal_LinkDetallAgenda.getFriendlyUrl()?has_content> href="${subelem.Internal_LinkDetallAgenda.getFriendlyUrl()}" target="_self" <#elseif subelem.linkTypeDetallAgenda.getData() == "intern" && subelem.External_LinkDetallAgenda?? && subelem.External_LinkDetallAgenda.getData()?has_content> href="${subelem.External_LinkDetallAgenda.getData()}" target="_self" </#if>>
319 <span class="button__label">${subelem.linkTextDetallAgenda.getData()}</span>
320 </a>
321 </#foreach>
322 </div>
323 </div>
324</#if>
325
326
327<#-- DT_PP_TITULO_VIDEO -->
328
329<#if stPpVideo?? && stPpVideo.linkFieldSet.link.getData()?has_content && (!stPpVideo.hideStPpVideo?? || !getterUtil.getBoolean(stPpVideo.hideStPpVideo.getData()))>
330 <style>
331 .points-video__video-cover.no_video::after{
332 background: none;
333 }
334 </style>
335 <#assign hasLink = false>
336 <#if stPpVideo.linkHeader?? && stPpVideo.linkHeader.getData()?has_content && stPpVideo.linkHeaderText?? && stPpVideo.linkHeaderText.getData()?has_content>
337 <#assign hasLink = true>
338 </#if>
339 <section class="points-video bg-gray pt-56">
340 <div class="main__container">
341 <div class="full-body">
342 <div class="full-body__container points-video__header-extra-container">
343 <#if stPpVideo.linkFieldSet.linkFieldSetFieldSet.ancoraVideo.getData()?has_content && stPpVideo.linkFieldSet.linkFieldSetFieldSet.ancoraVideo.getData()?trim?has_content>
344 <a name="${stPpVideo.linkFieldSet.linkFieldSetFieldSet.ancoraVideo.getData()}" id="${stPpVideo.linkFieldSet.linkFieldSetFieldSet.ancoraVideo.getData()}">
345 </a>
346 </#if>
347 <#if stPpVideo.titol?? && stPpVideo.titol.getData()?has_content>
348 <div class="points-video__header">
349 <div class="points-video__header-extra" <#if !hasLink>style="justify-content: center; margin-right: 0;"</#if>>
350 <h2 class="points-video__title">
351 ${stPpVideo.titol.getData()}</h2>
352 <#if hasLink>
353 <a class="points-video__subtitle-link" href="${stPpVideo.linkHeader.getData()}">${stPpVideo.linkHeaderText.getData()}</a>
354 </#if>
355 </div>
356 <p class="points-video__description" <#if !hasLink>style="text-align: center; max-width: 100%;"</#if>>
357 ${stPpVideo.descriptiu.getData()}</p>
358 </div>
359 </#if>
360
361 <div class="points-video__video-item cookieconsent-optin-marketing media-unit__content" id="marketingCookies">
362 <#if stPpVideo.linkFieldSet.link.getData()?has_content>
363 <#assign start = stPpVideo.linkFieldSet.link.getData()?index_of("v=") + 2>
364 <#--13 because v= + 11 char for youtube ids
365 -->
366 <#assign end = start + 11>
367 <a href="${stPpVideo.linkFieldSet.link.getData()}" class="points-video__video-stPpVideo.linkFieldSet.link" title="${stPpVideo.linkFieldSet.linkFieldSetFieldSet.descriptiuVideo.getData()}"
368 rel="dialog-video" data-video="${stPpVideo.linkFieldSet.link.getData()?substring(start, end)}">
369 <div class="points-video__video-cover" style="background-image: url(${stPpVideo.linkFieldSet.linkFieldSetFieldSet.imgVideoFieldSet.imgVideo.getData()});">
370 <img src="${stPpVideo.linkFieldSet.linkFieldSetFieldSet.imgVideoFieldSet.imgVideo.getData()}" alt="${stPpVideo.linkFieldSet.linkFieldSetFieldSet.imgVideoFieldSet.imgVideoFieldSetFieldSet.alt.getData()}" class="points-video__video-image">
371 </div>
372 <#if stPpVideo.linkFieldSet.linkFieldSetFieldSet.descriptiuVideo.getData()?has_content>
373 <p class="points-video__caption">
374 ${stPpVideo.linkFieldSet.linkFieldSetFieldSet.descriptiuVideo.getData()}</p>
375 </#if>
376 </a>
377 <#else>
378 <a class="points-video__video-link" title="${stPpVideo.linkFieldSet.linkFieldSetFieldSet.descriptiuVideo.getData()}">
379 <div class="points-video__video-cover no_video" style="background-image: url(${stPpVideo.linkFieldSet.linkFieldSetFieldSet.imgVideoFieldSet.imgVideo.getData()});">
380 <img src="${stPpVideo.linkFieldSet.linkFieldSetFieldSet.imgVideoFieldSet.imgVideo.getData()}" alt="${stPpVideo.linkFieldSet.linkFieldSetFieldSet.imgVideoFieldSet.imgVideoFieldSetFieldSet.alt.getData()}" class="points-video__video-image">
381 </div>
382 <#if stPpVideo.linkFieldSet.linkFieldSetFieldSet.descriptiuVideo.getData()?has_content>
383 <p class="points-video__caption">
384 ${stPpVideo.linkFieldSet.linkFieldSetFieldSet.descriptiuVideo.getData()}</p>
385 </#if>
386 </a>
387
388 </#if>
389 </div>
390 <div class='cookieconsent-optout-marketing media-unit__content'>
391 <@liferay.language key="cookiebot.youtube.no-marketing"/>
392 </div>
393 <#if hasLink>
394 <a class="points-video__subtitle-link-mobile" href="${stPpVideo.linkHeader.getData()}">${stPpVideo.linkHeaderText.getData()}</a>
395 </#if>
396 </div>
397 </div>
398 </div>
399 </section>
400 <section class="video-dialog js__video-dialog u-hidden">
401 <div class="u-hidden" id="fragment-show-video">
402 <div class="video-dialog__panel">
403 <header class="video-dialog__header">
404 <button class="video-dialog__close js__video-dialog-close">
405 Cerrar</button>
406 </header>
407 <div class="video-dialog__content">
408 <div class="video-dialog__inner js__video-dialog-container">
409 <iframe data-cookieconsent="marketing" data-cookieblock-src="https://www.youtube.com/embed/${stPpVideo.linkFieldSet.link.getData()?substring(start, end)}" frameborder="0" class="video-dialog__media" allow="encrypted-media" allowfullscreen="">
410 </iframe>
411 </div>
412 </div>
413 </div>
414 </div>
415 <div class="video-dialog__overlay js__video-dialog-close">
416 </div>
417 </section>
418</#if>
419
420
421<#-- TEXT-CARRUSEL-IMATGES-ALT -->
422
423<#if textCarruselImatges2?? && 0 < textCarruselImatges2.elementsFieldSetAlt.getSiblings()?size && textCarruselImatges2.elementsFieldSetAlt.getSiblings()[0].elementsFieldSetFieldSetAlt.imageAlt?? && textCarruselImatges2.elementsFieldSetAlt.getSiblings()[0].elementsFieldSetFieldSetAlt.imageAlt.getData()?has_content && (!textCarruselImatges2.hideTextCarruselImatgesAlt?? || !getterUtil.getBoolean(textCarruselImatges2.hideTextCarruselImatgesAlt.getData()))>
424 <#assign imagesFolder = themeDisplay.getPathThemeImages()>
425
426 <#assign entriesMapList = []>
427 <#foreach elem in textCarruselImatges2.elementsFieldSetAlt.getSiblings()>
428 <#if elem.elementsFieldSetFieldSetAlt.order?has_content>
429 <#assign currentOrder = elem.elementsFieldSetFieldSetAlt.order.getData()>
430 </#if>
431 <#if !currentOrder?has_content || currentOrder == "null">
432 <#assign currentOrder = "99">
433 </#if>
434 <#assign currEntryMap = {"entry" : elem.elementsFieldSetFieldSetAlt , "order" : currentOrder?number}>
435 <#assign entriesMapList = entriesMapList + [currEntryMap]>
436 </#foreach>
437
438 <#assign sortedEntriesMapList = entriesMapList?sort_by("order")>
439 <#assign sortedEntriesRootElems = []>
440
441 <#foreach currEntryMap in sortedEntriesMapList>
442 <#assign sortedEntriesRootElems = sortedEntriesRootElems + [currEntryMap.entry]>
443 </#foreach>
444
445 <#assign leftContent = "">
446 <#if textCarruselImatges2.titleHeaderAlt?? && textCarruselImatges2.titleHeaderAlt.getData()?has_content && textCarruselImatges2.descHeaderAlt?? && textCarruselImatges2.descHeaderAlt?has_content>
447 <#assign leftContent = "true">
448 </#if>
449
450 <div class="full-body__container hero-carousel-new hero-carousel hero-carousel--super hero-carousel-banner-alt <#if !leftContent?has_content>hero-carousel-banner-solo</#if>">
451 <#if leftContent?has_content>
452 <div class="hero-carousel__container-banner">
453 <h2 class="hero-carousel-banner-alt-title">
454 ${textCarruselImatges2.titleHeaderAlt.getData()}
455 </h2>
456 <p class="hero-carousel-banner-alt-desc">
457 ${textCarruselImatges2.descHeaderAlt.getData()}
458 </p>
459 </div>
460 </#if>
461 <div aria-live="polite" aria-atomic="false" aria-relevant="all" class="slick-list draggable">
462 <div class="hero-carousel__container js-carousel-banner-al_alt is-playing"
463 data-prev-text='<@liferay.language key="label.carousel.prev"/>'
464 data-next-text='<@liferay.language key="label.carousel.next"/>'
465 data-pagination-text='<@liferay.language key="label.carousel.outstanding"/>'
466 data-stop-text='<@liferay.language key="label.carousel.pause"/>'
467 data-play-text='<@liferay.language key="label.carousel.start"/>'>
468 <#if sortedEntriesRootElems?has_content>
469 <#foreach element in sortedEntriesRootElems>
470 <div class="hero hero--super">
471 <div class="hero__container">
472 <#if element.typeLinkAlt.getData() == "video">
473 <a href="#" onclick='showVideoModalBanner(`${element.External_LinkAlt.getData()}`);return false;' class="hero__link" <#if element.titleLinkAlt?? && element.titleLinkAlt.getData()?has_content>title="${element.titleLinkAlt.getData()}"</#if>>
474 <#else>
475 <a class="hero__link" <#if element.titleLinkAlt?? && element.titleLinkAlt.getData()?has_content>title="${element.titleLinkAlt.getData()}"</#if> <#if element.typeLinkAlt.getData() == "extern"> href="${element.External_LinkAlt.getData()}" target="_blank" <#elseif element.typeLinkAlt.getData() == "intern" && element.Internal_Link?? && element.Internal_Link.getFriendlyUrl()?has_content> href="${element.Internal_Link.getFriendlyUrl()}" target="_self" <#elseif element.typeLinkAlt.getData() == "intern" && element.External_LinkAlt?? && element.External_LinkAlt.getData()?has_content> href="${element.External_LinkAlt.getData()}" target="_self" </#if>>
476 </#if>
477 <div class="hero__media <#if (!element.titleElemAlt?? || !element.titleElemAlt.getData()?has_content) && (!element.descElemAlt?? || !element.descElemAlt.getData()?has_content)>hero__media-no-fade</#if>">
478 <#if element.typeLinkAlt.getData() == "video">
479 <div class="hero__media-video__container">
480 <span class="hero__media-video__img">
481 </span>
482 </div>
483 </#if>
484 <img class="hero__image hero__image-new lazyload" data-src="${element.imageAlt.getData()}" <#if element.altImage?? && element.altImage.getData()?has_content>alt="${element.altImage.getData()}"</#if>>
485 </div>
486 <div class="hero__content white__banner">
487 <p class="hero__title" >
488 ${element.titleElemAlt.getData()}
489 <#if element.typeLinkAlt.getData() == "extern">
490 <span class="window-warning">
491 <img class="window-warning__icon" src="${imagesFolder}/basic/16px/png/icone-obrir-fora-blanc-16x16.png" alt="<@liferay.language key="label.externalLink.alt"/>" title="<@liferay.language key="label.externalLink.title"/>">
492 </span>
493 </#if>
494 </p>
495 <p class="hero__desc-alt" >
496 ${element.descElemAlt.getData()}
497 </p>
498 </div>
499 </a>
500 </div>
501 </div>
502 </#foreach>
503 </#if>
504 </div>
505 </div>
506 </div>
507
508 <div class="dialog">
509 <div id="carrusel-banner-video" class="u-hidden">
510 <div class="dialog__body dialog__body--jotmbe" id="carrusel-banner-video-content">
511 </div>
512 </div>
513 </div>
514 <script type="text/javascript">
515 initSliderCarruselBanner2();
516
517 function initSliderCarruselBanner2() {
518 if($(".js-carousel-banner-al_alt").hasClass('slick-initialized')) {
519 $(".js-carousel-banner-al_alt").slick("unslick");
520 }
521 $('.js-carousel-banner-al_alt .slick-toggle-play').remove();
522 $('.js-carousel-banner-al_alt').slick({
523 slidesToShow: 1,
524 arrows: true,
525 draggable: true,
526 infinite: false,
527 variableWidth: false,
528 autoplaySpeed: 4000,
529 dots: true,
530 nextArrow: '<button type="button" class="slick-next"><img class="slick-next__icon slick-next__icon-normal" src="${imagesFolder}/basic/18px/svg/arrow-next-black.svg" alt=\'<@liferay.language key="label.next"/>\'/><img class="slick-next__icon slick-next__icon-disabled" src="${imagesFolder}/basic/18px/svg/arrow-next-gray.svg" alt=\'<@liferay.language key="label.next"/>\'/></button>',
531 prevArrow: '<button type="button" class="slick-prev"><img class="slick-prev__icon slick-prev__icon-normal" src="${imagesFolder}/basic/18px/svg/arrow-prev-black.svg" alt=\'<@liferay.language key="label.prev"/>\'/><img class="slick-prev__icon slick-prev__icon-disabled" src="${imagesFolder}/basic/18px/svg/arrow-prev-gray.svg" alt=\'<@liferay.language key="label.prev"/>\'/></button>',
532 responsive: [
533 {
534 breakpoint: 767,
535 settings: {
536 slidesToShow: 1,
537 arrows: false,
538 variableWidth: true,
539 dots: true
540 }
541 }
542 ]
543 }).each(function () {
544 var carousel = $(this),
545 toggleButton,
546 toggleIcon;
547
548 carousel.find('.slick-next__icon').attr({
549 'alt': carousel.data('next-text')
550 });
551
552 carousel.find('.slick-prev__icon').attr({
553 'alt': carousel.data('prev-text')
554 });
555 });
556
557 if ($('.hero-carousel__container .hero').length == 1) {
558 $('.hero-carousel__container .slick-toggle-play').hide();
559 }
560
561 $('.slick-cloned[aria-describedby]').removeAttr('aria-describedby');
562 if($(".js-carousel-banner-al_alt .slick-dots").length > 0) {
563 setDotsPositionBanner2();
564 }
565 }
566
567 function showVideoModalBanner2(link) {
568 const start = link.indexOf("v=") + 2;
569 const end = start + 2 + 11;
570
571 TMB.dialog.newModal(langJotmbeClose, "dialog--jotmbe__no-footer dialog--jotmbe__no-icon dialog--jotmbe__with-actions dialog-video-iframe", "carrusel-banner-video", "");
572 $('#carrusel-banner-video-content').html('<iframe class="home-carrusel-video-iframe" src="https://www.youtube.com/embed/'+link.substring(start, end)+'" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>');
573 }
574 function setDotsPositionBanner2() {
575 $(".js-carousel-banner-al_alt .slick-dots").appendTo($(".js-carousel-banner-al_alt").parent());
576 }
577
578 window.addEventListener('resize', function(event){
579 const width = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth;
580 if($(".js-carousel-banner-al_alt .slick-dots").length > 0 && width > 768) {
581 setDotsPositionBanner2();
582 }
583 });
584
585 </script>
586</#if>
587
588
589<#-- CARRUSEL-TRES-CARD -->
590
591<#if referencesFieldSet?? && 0 < referencesFieldSet.getSiblings()?size && referencesFieldSet.getSiblings()[0].referenceId.getData()?has_content && (!hideTresCards?? || !getterUtil.getBoolean(hideTresCards.getData()))>
592 <#assign colorClass = "" />
593 <#assign fullBody = "" />
594 <#if fondoColorCarruselCards?? && fondoColorCarruselCards.getData()??>
595 <#if fondoColorCarruselCards.getData()=="blanc">
596 <#assign colorClass = "hola-bcn-carrusel-standard--white" />
597 <#assign fullBody = "full-body__container" />
598 <#else>
599 <#assign colorClass = "hola-bcn-carrusel-standard--gray" />
600 <#assign fullBody = "full-body__container" />
601 </#if>
602 </#if>
603
604 <section class="hola-bcn-carrusel-standard ${colorClass}">
605 <div class="hola-bcn-carrusel-standard-cont-ext hola-bcn-carrusel-standard-cont-ext-extra hola-bcn-carrusel-standard-cont-ext-flex ${fullBody}">
606 <div class="hola-bcn-carrusel-standard--container">
607 <div class="hola-bcn-carrusel-standard--outer">
608 <div class="hola-bcn-carrusel-standard_new-header">
609 <h2 class="title title--1 hola-bcn-carrusel-standard__title hola-bcn-carrusel-standard__title_new">${titleCarruselCards.getData()}</h2>
610 <p class="hola-bcn-carrusel-standard__intro-text">${subtitleCarruselCards.getData()}</p>
611 </div>
612 <ul id="result-list" class="hola-bcn-carrusel-standard__items js__hola-bcn-standard-slider">
613 <#assign tmbGroupId = 20182>
614 <#assign fundacioGroupId = 79790>
615 <#list referencesFieldSet.getSiblings() as element>
616 <#assign JournalArticleLocalService = serviceLocator.findService("com.liferay.journal.service.JournalArticleLocalService")>
617 <#assign articleId = element.referenceId.getData()>
618 <#assign groupId = getterUtil.getLong(groupId)>
619 <#attempt>
620 <#assign journalArticle = JournalArticleLocalService.getArticle(groupId, articleId) />
621 <#recover>
622 <#if groupId == tmbGroupId>
623 <#assign groupId = fundacioGroupId>
624 <#else>
625 <#assign groupId = tmbGroupId>
626 </#if>
627 <#attempt>
628 <#assign journalArticle = JournalArticleLocalService.getArticle(groupId, articleId)!>
629 <#recover>
630 <#assign journalArticle = "">
631 </#attempt>
632 </#attempt>
633 <#if journalArticle?has_content && journalArticle != "">
634 <#assign document = saxReaderUtil.read(journalArticle.getContent())>
635 <#assign rootElement = document.getRootElement()>
636
637 <#assign resourceprimKey = journalArticle.getResourcePrimKey()>
638 <#assign assetEntry = assetEntryLocalService.getEntry("com.liferay.journal.model.JournalArticle", resourceprimKey)>
639 <#assign assetRenderer = assetEntry.getAssetRenderer()>
640 <#assign articleURL = assetRenderer.getURLViewInContext(renderRequest, renderResponse, "")>
641 <#assign articleFriendlyURL = assetRenderer.getUrlTitle()>
642 <#assign newwindow = "">
643 <#if !articleURL?has_content>
644 <#assign newwindow = "target='_blank'">
645 <#if !isFundacio>
646 <#if currentURL?contains("pre3")>
647 <#assign articleURL = "https://pre3-fundacio.tmb.cat/" + locale.getLanguage() + "/w/" + articleFriendlyURL>
648 <#else>
649 <#assign articleURL = "https://fundacio.tmb.cat/" + locale.getLanguage() + "/w/" + articleFriendlyURL>
650 </#if>
651 <#else>
652 <#if currentURL?contains("pre3")>
653 <#assign articleURL = "https://pre3.tmb.cat/" + locale.getLanguage() + "/w/" + articleFriendlyURL>
654 <#else>
655 <#assign articleURL = "https://www.tmb.cat/" + locale.getLanguage() + "/w/" + articleFriendlyURL>
656 </#if>
657 </#if>
658 </#if>
659
660 <#assign title = "">
661 <#assign titleSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='titleGlobal']/dynamic-content[@language-id='" + locale + "']")>
662 <#if titleSel.selectSingleNode(rootElement)?has_content>
663 <#assign title = titleSel.selectSingleNode(rootElement).getStringValue()>
664 </#if>
665
666 <#assign subtitle = "">
667 <#assign subtitleSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='subtitleGlobal']/dynamic-content[@language-id='" + locale + "']")>
668 <#if subtitleSel.selectSingleNode(rootElement)?has_content>
669 <#assign subtitle = subtitleSel.selectSingleNode(rootElement).getStringValue()>
670 </#if>
671
672 <#assign initDateNovetatAgenda = "">
673 <#assign fromInitDateNovetatAgenda = "">
674 <#assign endDateNovetatAgenda = "">
675 <#assign whereNovetatAgenda = "">
676 <#assign novetatAgendaSel = rootElement.selectSingleNode("dynamic-element[@field-reference='blocInfoAgenda']")!"">
677 <#if novetatAgendaSel?has_content>
678 <#assign dateNovetatAgendaSelSel = novetatAgendaSel.selectSingleNode("dynamic-element[@field-reference='whenBlocInfoAgenda']")!"">
679
680 <#if dateNovetatAgendaSelSel?has_content && dateNovetatAgendaSelSel.selectSingleNode("dynamic-element[@field-reference='initDateBlocInfoAgenda']/dynamic-content[@language-id='" + locale + "']")?has_content>
681 <#assign initDateNovetatAgenda = dateNovetatAgendaSelSel.selectSingleNode("dynamic-element[@field-reference='initDateBlocInfoAgenda']/dynamic-content[@language-id='" + locale + "']").getStringValue()>
682 </#if>
683
684 <#if dateNovetatAgendaSelSel?has_content && dateNovetatAgendaSelSel.selectSingleNode("dynamic-element[@field-reference='fromInitDateBlocInfoAgenda']/dynamic-content[@language-id='" + locale + "']")?has_content>
685 <#assign fromInitDateNovetatAgenda = dateNovetatAgendaSelSel.selectSingleNode("dynamic-element[@field-reference='fromInitDateBlocInfoAgenda']/dynamic-content[@language-id='" + locale + "']").getStringValue()>
686 </#if>
687
688 <#if dateNovetatAgendaSelSel?has_content && dateNovetatAgendaSelSel.selectSingleNode("dynamic-element[@field-reference='endDateBlocInfoAgenda']/dynamic-content[@language-id='" + locale + "']")?has_content>
689 <#assign endDateNovetatAgenda = dateNovetatAgendaSelSel.selectSingleNode("dynamic-element[@field-reference='endDateBlocInfoAgenda']/dynamic-content[@language-id='" + locale + "']").getStringValue()>
690 </#if>
691
692 <#assign whereNovetatAgendaSelSel = novetatAgendaSel.selectSingleNode("dynamic-element[@field-reference='whereBlocInfoAgenda']")!"">
693 <#if whereNovetatAgendaSelSel?has_content && whereNovetatAgendaSelSel.selectSingleNode("dynamic-element[@field-reference='textWhereBlocInfoAgenda']/dynamic-content[@language-id='" + locale + "']")?has_content>
694 <#assign whereNovetatAgenda = whereNovetatAgendaSelSel.selectSingleNode("dynamic-element[@field-reference='textWhereBlocInfoAgenda']/dynamic-content[@language-id='" + locale + "']").getStringValue()>
695 </#if>
696 </#if>
697
698 <#assign typeNovetatAgenda = "">
699 <#assign typeNovetatAgendaSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='typeNovetatAgenda']/dynamic-content[@language-id='" + locale + "']")>
700 <#if typeNovetatAgendaSel.selectSingleNode(rootElement)?has_content>
701 <#assign typeNovetatAgenda = typeNovetatAgendaSel.selectSingleNode(rootElement).getStringValue()>
702 </#if>
703
704 <#assign filterNovetatAgenda = "">
705 <#assign filterNovetatAgendaSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='filterNovetatAgenda']/dynamic-content[@language-id='" + locale + "']")>
706 <#if filterNovetatAgendaSel.selectSingleNode(rootElement)?has_content>
707 <#assign filterNovetatAgenda = filterNovetatAgendaSel.selectSingleNode(rootElement).getStringValue()>
708 </#if>
709
710 <#assign imageNovetatAgenda = "">
711 <#assign imageNovetatAgendaSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='imageCardNovetatAgenda']/dynamic-content[@language-id='" + locale + "']")>
712 <#if imageNovetatAgendaSel.selectSingleNode(rootElement)?has_content>
713 <#assign image = imageNovetatAgendaSel.selectSingleNode(rootElement).getStringValue()>
714 <#assign imageUuid = jsonFactoryUtil.createJSONObject(image).uuid!"">
715 <#assign imageNovetatAgenda = themeDisplay.getPortalURL() + themeDisplay.getPathContext() + "/documents/" + groupId + "/" + imageUuid>
716 </#if>
717
718 <#assign imageAltNovetatAgenda = "">
719 <#assign imageAltNovetatAgendaSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='altImageCardNovetatAgenda']/dynamic-content[@language-id='" + locale + "']")>
720 <#if imageAltNovetatAgendaSel.selectSingleNode(rootElement)?has_content>
721 <#assign imageAltNovetatAgenda = imageAltNovetatAgendaSel.selectSingleNode(rootElement).getStringValue()>
722 </#if>
723
724 <#assign pubDateNovetatAgenda = "">
725 <#assign pubDateNovetatAgendaSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='pubDateNovetatAgenda']/dynamic-content[@language-id='" + locale + "']")>
726 <#if pubDateNovetatAgendaSel.selectSingleNode(rootElement)?has_content>
727 <#assign pubDateNovetatAgenda = pubDateNovetatAgendaSel.selectSingleNode(rootElement).getStringValue()>
728 </#if>
729
730 <#assign pubTimeNovetatAgenda = "">
731 <#assign pubTimeNovetatAgendaSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='pubTimeNovetatAgenda']/dynamic-content[@language-id='" + locale + "']")>
732 <#if pubTimeNovetatAgendaSel.selectSingleNode(rootElement)?has_content>
733 <#assign pubTimeNovetatAgenda = pubTimeNovetatAgendaSel.selectSingleNode(rootElement).getStringValue()>
734 </#if>
735
736 <#assign despubDateNovetatAgenda = "">
737 <#assign despubDateNovetatAgendaSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='despubDateNovetatAgenda']/dynamic-content[@language-id='" + locale + "']")>
738 <#if despubDateNovetatAgendaSel.selectSingleNode(rootElement)?has_content>
739 <#assign despubDateNovetatAgenda = despubDateNovetatAgendaSel.selectSingleNode(rootElement).getStringValue()>
740 </#if>
741
742 <#assign despubTimeNovetatAgenda = "">
743 <#assign despubTimeNovetatAgendaSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='despubTimeNovetatAgenda']/dynamic-content[@language-id='" + locale + "']")>
744 <#if despubTimeNovetatAgendaSel.selectSingleNode(rootElement)?has_content>
745 <#assign despubTimeNovetatAgenda = despubTimeNovetatAgendaSel.selectSingleNode(rootElement).getStringValue()>
746 </#if>
747
748 <#assign isExpiredNovetatAgenda = "">
749 <#assign isExpiredNovetatAgendaSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='isExpiredNovetatAgenda']/dynamic-content[@language-id='" + locale + "']")>
750 <#if isExpiredNovetatAgendaSel.selectSingleNode(rootElement)?has_content>
751 <#assign isExpiredNovetatAgenda = isExpiredNovetatAgendaSel.selectSingleNode(rootElement).getStringValue()>
752 </#if>
753
754 <#assign isPublishedNA = false>
755 <#if (pubDateNovetatAgenda?has_content)>
756 <#if pubTimeNovetatAgenda?has_content>
757 <#assign timeActDate = pubTimeNovetatAgenda?date["HH:mm"]>
758 <#assign timeActFormat = timeActDate?string["HH:mm"]>
759 <#else>
760 <#assign timeActDate = "">
761 <#assign timeActFormat = "">
762 </#if>
763 <#attempt>
764 <#assign dataAct = pubDateNovetatAgenda?date["yyyy-MM-dd"]>
765
766 <#if timeActFormat?has_content && timeActFormat != "">
767 <#assign dataActMil = miliSeconds(timeActFormat dataAct?long)>
768 <#assign dataAct = dateUtil.newDate(getterUtil.getLong(dataActMil))>
769 </#if>
770 <#assign dataActMil = dataAct?long>
771 <#assign now = .now?long+timeZoneUtil.getTimeZone("Europe/Madrid").getOffset(.now?long)>
772 <#assign isPublishedNA = (dataActMil - now ) < 0 />
773 <#recover>
774 </#attempt>
775 </#if>
776
777 <#assign isDespublishedNA = false>
778 <#if (despubDateNovetatAgenda?has_content)>
779 <#if despubTimeNovetatAgenda?has_content>
780 <#assign timeExpDate = despubTimeNovetatAgenda?date["HH:mm"]>
781 <#assign timeExpFormat = timeExpDate?string["HH:mm"]>
782 <#else>
783 <#assign timeExpDate = "">
784 <#assign timeExpFormat = "">
785 </#if>
786 <#attempt>
787 <#assign dataExp = despubDateNovetatAgenda?date["yyyy-MM-dd"]>
788
789 <#if timeExpFormat?has_content && timeExpFormat != "">
790 <#assign dataExpMil = miliSeconds(timeExpFormat dataExp?long)>
791 <#assign dataExp = dateUtil.newDate(getterUtil.getLong(dataExpMil))>
792 </#if>
793 <#assign dataExpMil = dataExp?long>
794 <#assign now = .now?long+timeZoneUtil.getTimeZone("Europe/Madrid").getOffset(.now?long)>
795 <#assign isDespublishedNA = (dataExpMil - now) < 0 />
796 <#recover>
797 </#attempt>
798 </#if>
799
800 <#assign isExpiredNA = false>
801 <#if journalArticle.expirationDate??>
802 <#assign dataExp = journalArticle.expirationDate?datetime>
803 <#attempt>
804 <#assign dataExpMil = dataExp?long>
805 <#assign now = .now?long+timeZoneUtil.getTimeZone("Europe/Madrid").getOffset(.now?long)>
806 <#assign isExpiredNA = (dataExpMil - now) < 0 />
807 <#recover>
808 </#attempt>
809 </#if>
810
811 <#assign showNovetatAgenda = false>
812 <#if typeNovetatAgenda?has_content && typeNovetatAgenda == "1">
813 <#assign showNovetatAgenda = isPublishedNA && !isExpiredNA && !isDespublishedNA && isExpiredNovetatAgenda != "true">
814 <#else>
815 <#assign showNovetatAgenda = isPublishedNA && !isExpiredNA && isExpiredNovetatAgenda != "true">
816 </#if>
817
818 <#if showNovetatAgenda>
819 <#if title?has_content>
820 <li class="hola-bcn-carrusel-standard_new-li">
821 <a ${newwindow} class="hola-bcn-carrusel-standard_new <#if isDespublishedNA>hola-bcn-carrusel-standard_new-finished</#if>" href="${articleURL}">
822 <div class="hola-bcn-carrusel-standard__card-cover">
823 <div class="hola-bcn-carrusel-standard__card-cover-filter"></div>
824 <img class="hola-bcn-carrusel-standard__image" src="${imageNovetatAgenda}" <#if imageAltNovetatAgenda?has_content>alt="${imageAltNovetatAgenda}"<#else>alt=""</#if>>
825 <div class="hola-bcn-carrusel-standard-finished-text" <#if isDespublishedNA>style="display: block;"</#if>>
826 <span><@liferay.language key='label.bloc.novetatagenda.finished' /></span>
827 </div>
828 <#if filterNovetatAgenda?has_content>
829 <div class="hola-bcn-carrusel-standard-highlight">
830 <span><@liferay.language key='label.bloc.novetatagenda.filter.${filterNovetatAgenda}' /></span>
831 </div>
832 </#if>
833 </div>
834 <div class="hola-bcn-carrusel-standard-container">
835 <div>
836 <h3 class="hola-bcn-carrusel-standard__card-title">
837 ${title}
838 <#if newwindow?? && newwindow?has_content>
839 <span class="icon-external-black" alt="Enllaç extern" title="(Obre una nova finestra)"></span>
840 </#if>
841 </h3>
842 <span class="hola-bcn-carrusel-standard__card-description">
843 ${subtitle}
844 </span>
845 </div>
846 <#if initDateNovetatAgenda?has_content || endDateNovetatAgenda?has_content || (whereNovetatAgenda?has_content)>
847 <div class="hola-bcn-carrusel-standard_bottom-extra">
848 <#if initDateNovetatAgenda?has_content || endDateNovetatAgenda?has_content>
849 <div class="hola-bcn-carrusel-standard-date">
850 <#if fromInitDateNovetatAgenda == "true">
851 <span><b><@liferay.language key='label.bloc.novetatagenda.when' /></b> <@liferay.language key='label.bloc.novetatagenda.from' /> ${initDateNovetatAgenda?date["yyyy-MM-dd"]?string("dd/MM/yyyy")}</span>
852 <#else>
853 <span><b><@liferay.language key='label.bloc.novetatagenda.when' /></b> <@liferay.language key='label.bloc.novetatagenda.from' /> ${initDateNovetatAgenda?date["yyyy-MM-dd"]?string("dd/MM/yyyy")}<#if endDateNovetatAgenda?has_content> <@liferay.language key='label.bloc.novetatagenda.to' /> ${endDateNovetatAgenda?date["yyyy-MM-dd"]?string("dd/MM/yyyy")}</#if></span>
854 </#if>
855 </div>
856 </#if>
857 <#if whereNovetatAgenda?has_content>
858 <div class="hola-bcn-carrusel-standard-where">
859 <span><b><@liferay.language key='label.bloc.novetatagenda.where' /> <span class="hola-bcn-carrusel-standard-where-inner">${whereNovetatAgenda}</span></b></span>
860 </div>
861 </#if>
862 </div>
863 </#if>
864 </div>
865 </a>
866 </li>
867 </#if>
868 </#if>
869 </#if>
870 </#list>
871 </ul>
872 </div>
873 </div>
874 </div>
875 </section>
876
877 <script type="text/javascript">
878
879 $(document).ready(function() {
880 initSliderBcnStandard();
881 });
882
883 function initSliderBcnStandard() {
884 if($(".js__hola-bcn-standard-slider").hasClass('slick-initialized')) {
885 $(".js__hola-bcn-standard-slider").slick("unslick");
886 }
887
888 $('.js__hola-bcn-standard-slider').slick({
889 slidesToShow: 3,
890 slidesToScroll: 1,
891 arrows: false,
892 dots: false,
893 draggable: false,
894 infinite: false,
895 responsive: [
896 {
897 breakpoint: 767,
898 settings: {
899 variableWidth: true,
900 slidesToShow: 2,
901 slidesToScroll: 1,
902 arrows: false,
903 dots: true,
904 draggable: true,
905 infinite: true
906 }
907 }
908 ]
909 });
910 }
911
912 </script>
913</#if>

Et trobes a:
Exposició QUINCE, a través de la mirada d’una generació
La Fundació Street Child dona visibilitat a les vides d’infants que sobreviuen en condicions terribles arreu del planeta.
Quan: 06.09.2024 a 31.12.2024
On: Espai Mercè Sala - Fundació TMB
Accés: Entrada gratuïta*
La Fundació Street Child España i la Fundació TMB presenten l'exposició de fotografia QUINZE: A través de la mirada d'una generació a l'Espai Mercè.
Aquesta exposició és un projecte de fotografia participativa realitzada amb la col·laboració de fotògrafs locals de Bangla Desh, Nepal, Nigèria, Ucraïna i Uganda, que van dirigir tallers de creació fotogràfica amb joves de 15 anys en això racons tan particulars i complexos del món. Des de zones de conflicte actiu i camps de refugiats, fins a comunitats remotes, aquesta exposició explora allò que significa tenir 15 anys en contextos dràsticament diferents.
L'origen d'aquesta exposició es basa en un reeixit projecte pilot de fotografia participativa de la Fundació Street Child en col·laboració del fotògraf i cineasta independent nigerià Nelson Apochi Owoicho, que tenia com a objectiu apoderar i inspirar nenes en risc d'abandonar l'escola a Nigèria. Posteriorment, a cadascun dels països, Street Child va treballar amb fotògrafs i socis locals per organitzar tallers de fotografia participativa amb joves de 15 anys. Juntament amb els programes educatius de la fundació a aquestes comunitats, la formació els va brindar l'oportunitat d'expressar-se a través de la creativitat.
El valor afegit d'aquesta exposició rau en l'oportunitat d'oferir als nens, nenes i joves, que són el motor de canvi i la raó principal de l'existència de Street Child, una eina expressiva i un espai segur per explicar les vostres pròpies històries. Alhora, se subratlla la importància de la seva educació per al seu desenvolupament personal i el de les seves comunitats.
Amb aquesta proposta, la Fundació TMB dona a conèixer la tasca d’una entitat social que està desenvolupant projectes de cooperació i desenvolupament, alineant-se amb el projecte TMB Solidari i, a més a més, ho fa posant el focus en l’educació d’infants i adolescents, en la línia del projecte TMB Educa.