61 Commits
stge ... prod

Author SHA1 Message Date
ee51632b85 initial slide timeline 2025-12-01 23:40:54 +01:00
04a47789f7 anim header 2025-12-01 23:29:54 +01:00
ff4fabba70 toggle actu sur H2 2025-12-01 22:09:06 +01:00
fa2352b00f animation header plus rappide 2025-12-01 21:45:16 +01:00
6fe9fe1a54 animation header plus rappide 2025-12-01 20:38:17 +01:00
4e8fe4fb2d carte ressources va directement sur mission photo 2025-12-01 14:04:26 +01:00
ad9c0349c7 new fichier ressuorces.je 2025-12-01 13:35:51 +01:00
b266b73176 responsive node site 2025-12-01 12:54:44 +01:00
b1d2acd246 responsive node site 2025-12-01 12:52:32 +01:00
1f0f540268 responsive force presenteaiton femré 2025-12-01 12:29:02 +01:00
5edb071b35 responsive node projet 2025-12-01 12:16:35 +01:00
1f377f9b60 responsive node projet 2025-12-01 12:14:39 +01:00
446a8f2288 responsive node projet 2025-12-01 12:03:02 +01:00
53b935bd07 responsive node projet 2025-12-01 11:44:53 +01:00
c53e9461dd responsive /lesprojets 2025-12-01 10:47:35 +01:00
8a8ecbb3e4 responsive node ressource 2025-12-01 10:43:44 +01:00
cbc0053467 equipe panel toggle en js 2025-12-01 10:02:04 +01:00
02231b8e17 annule max-height presentation en js 2025-12-01 09:50:04 +01:00
811e6b5ca8 max-height presentation en js 2025-12-01 09:37:55 +01:00
fa8e32bef9 max-height presentation laureat 1500px 2025-12-01 09:19:12 +01:00
ebabc21095 css .islaureat 2025-11-28 11:44:52 +01:00
2b03838407 twig /lesprojets .islaureat 2025-11-28 11:43:45 +01:00
863f248656 fix bug ouverture actu home 2025-11-28 11:30:47 +01:00
66fe1c4adf position top badge 2025-11-28 10:57:00 +01:00
30b82fd22b Merge branch 'master' into stage 2025-11-28 10:52:10 +01:00
0b2ba2e1fd agrandir zone lien 2025-11-28 10:51:58 +01:00
ee2f83324c agrandir zone lien 2025-11-28 10:39:40 +01:00
50de82d79c Merge branch 'master' of gitea-figureslibres.io:bachir/drupal-quartiersdedemain into stage 2025-11-28 10:30:34 +01:00
3eb54aae88 badge laureat css 2025-11-28 10:29:46 +01:00
c3874cfee6 Merge branch 'master' of gitea-figureslibres.io:bachir/drupal-quartiersdedemain into stage 2025-11-28 10:24:56 +01:00
1e02cc5587 badge laureat twig et css 2025-11-28 10:22:43 +01:00
d58970f7d7 Merge branch 'master' into stage 2025-11-27 22:21:04 +01:00
bdeacad925 Home node actu cliquable pur toggle 2025-11-27 22:11:33 +01:00
ecb40418aa En savoir + clicable entièrement 2025-11-27 22:11:33 +01:00
dc661c6139 padding buton liens home 2025-11-27 22:11:33 +01:00
3641c9feff margin et padding bottom top ressources 2025-11-27 22:09:47 +01:00
45d6f1ba04 Home node actu cliquable pur toggle 2025-11-27 22:09:47 +01:00
b68b573e94 En savoir + clicable entièrement 2025-11-27 22:09:47 +01:00
7251762137 padding buton liens home 2025-11-27 22:09:47 +01:00
fb590bfee2 poid videos 2025-11-27 22:01:28 +01:00
eab3cabde3 ponderation sites 2025-11-27 21:54:22 +01:00
c0ccf25959 projets finalistes 2025-11-27 21:42:36 +01:00
a85122bbc7 Sur le même site de projet 2025-11-27 21:40:25 +01:00
21e92aee1d lauréat 2025-11-27 21:39:11 +01:00
a26f9140ce intro ressources 2025-11-27 21:34:30 +01:00
c94ec553eb interactivité carte ressource 2025-11-27 19:04:38 +01:00
7ba0a0ec05 js timelin et header séparé 2025-11-27 18:43:33 +01:00
e3a31427d3 js lightbox séparé 2025-11-27 18:11:14 +01:00
7a8abd9b5e taille et légende img lightbox 2025-11-27 17:42:02 +01:00
fd8584a9a6 change class mission photo 2025-11-27 17:15:40 +01:00
2cb4716015 header right langue switcher hidden 2025-11-27 17:04:29 +01:00
2666e046a9 enlever 2 dernière formes bleu dan shome 2025-11-27 16:57:47 +01:00
d947fa7aab desactive 2e partie enjeux sur home 2025-11-27 16:23:25 +01:00
15778d737d fleche ouverture presentation equipe 2025-11-25 19:02:26 +01:00
9c873c3b67 fleche ouverture presentation equipe 2025-11-25 18:58:06 +01:00
d7026f45e7 fleche ouverture presentation equipe 2025-11-25 18:55:24 +01:00
6272ac893c homogénéisation link ressources 2025-11-25 18:42:45 +01:00
fabad3ca5b bug js 2025-11-25 17:42:30 +01:00
6715b83031 bug js 2025-11-25 17:39:58 +01:00
c5748a9a30 webpack 2025-11-25 17:35:52 +01:00
3bfcc5e288 webpack 2025-11-25 17:26:05 +01:00
50 changed files with 3500 additions and 1713 deletions

View File

@@ -0,0 +1,17 @@
uuid: 480abc89-4c77-4260-a432-043c122cc0de
langcode: fr
status: true
dependencies: { }
id: intro_ressources
label: 'Intro ressources'
token: true
context:
show_warning: true
group:
language: true
fallback:
language: ''
menu:
path: /edit/ressources
weight: 0
description: ''

View File

@@ -0,0 +1,24 @@
uuid: dcde5806-938b-46b8-80f5-ce7e8b065dfc
langcode: fr
status: true
dependencies:
config:
- config_pages.type.intro_ressources
- field.field.config_pages.intro_ressources.field_intro
module:
- text
id: config_pages.intro_ressources.default
targetEntityType: config_pages
bundle: intro_ressources
mode: default
content:
field_intro:
type: text_textarea
weight: 0
region: content
settings:
rows: 5
placeholder: ''
third_party_settings: { }
hidden:
label: true

View File

@@ -10,6 +10,7 @@ dependencies:
- field.field.node.ressource.field_images
- field.field.node.ressource.field_liens
- field.field.node.ressource.field_mots_clefs
- field.field.node.ressource.field_poid
- field.field.node.ressource.field_site
- field.field.node.ressource.field_sous_titre
- field.field.node.ressource.field_tous_les_sites
@@ -34,6 +35,7 @@ third_party_settings:
- field_author
- field_type_de_ressource
- field_mots_clefs
- field_poid
- status
- promote
- path
@@ -183,6 +185,13 @@ content:
size: 60
placeholder: ''
third_party_settings: { }
field_poid:
type: number
weight: 41
region: content
settings:
placeholder: ''
third_party_settings: { }
field_site:
type: entity_reference_autocomplete
weight: 45
@@ -222,20 +231,20 @@ content:
third_party_settings: { }
path:
type: path
weight: 43
weight: 44
region: content
settings: { }
third_party_settings: { }
promote:
type: boolean_checkbox
weight: 42
weight: 43
region: content
settings:
display_label: true
third_party_settings: { }
status:
type: boolean_checkbox
weight: 41
weight: 42
region: content
settings:
display_label: true

View File

@@ -0,0 +1,23 @@
uuid: d7ddf5cc-556b-4b0e-9b4d-be805337b385
langcode: fr
status: true
dependencies:
config:
- config_pages.type.intro_ressources
- field.field.config_pages.intro_ressources.field_intro
module:
- text
id: config_pages.intro_ressources.default
targetEntityType: config_pages
bundle: intro_ressources
mode: default
content:
field_intro:
type: text_default
label: visually_hidden
settings: { }
third_party_settings: { }
weight: 0
region: content
hidden:
search_api_excerpt: true

View File

@@ -10,6 +10,7 @@ dependencies:
- field.field.node.ressource.field_images
- field.field.node.ressource.field_liens
- field.field.node.ressource.field_mots_clefs
- field.field.node.ressource.field_poid
- field.field.node.ressource.field_site
- field.field.node.ressource.field_sous_titre
- field.field.node.ressource.field_tous_les_sites
@@ -93,6 +94,15 @@ content:
third_party_settings: { }
weight: 103
region: content
field_poid:
type: number_integer
label: above
settings:
thousand_separator: ''
prefix_suffix: true
third_party_settings: { }
weight: 108
region: content
field_site:
type: entity_reference_label
label: visually_hidden

View File

@@ -11,6 +11,7 @@ dependencies:
- field.field.node.ressource.field_images
- field.field.node.ressource.field_liens
- field.field.node.ressource.field_mots_clefs
- field.field.node.ressource.field_poid
- field.field.node.ressource.field_site
- field.field.node.ressource.field_sous_titre
- field.field.node.ressource.field_tous_les_sites
@@ -79,6 +80,7 @@ hidden:
field_date_ressource: true
field_documents: true
field_mots_clefs: true
field_poid: true
field_sous_titre: true
field_tous_les_sites: true
field_type_de_ressource: true

View File

@@ -11,6 +11,7 @@ dependencies:
- field.field.node.ressource.field_images
- field.field.node.ressource.field_liens
- field.field.node.ressource.field_mots_clefs
- field.field.node.ressource.field_poid
- field.field.node.ressource.field_site
- field.field.node.ressource.field_sous_titre
- field.field.node.ressource.field_tous_les_sites
@@ -67,11 +68,11 @@ content:
label: visually_hidden
settings:
deltas: '0'
image_style: wide
deltas_reversed: false
image_link: content
image_style: wide
image_loading:
attribute: lazy
deltas_reversed: 0
third_party_settings: { }
weight: 0
region: content
@@ -122,6 +123,7 @@ content:
region: content
hidden:
created: true
field_poid: true
field_tous_les_sites: true
field_type_de_ressource: true
field_video: true

View File

@@ -0,0 +1,24 @@
uuid: 8b9c2799-90e2-4409-93fd-a087cf0b33d3
langcode: fr
status: true
dependencies:
config:
- config_pages.type.intro_ressources
- field.storage.config_pages.field_intro
- filter.format.wysiwyg
module:
- text
id: config_pages.intro_ressources.field_intro
field_name: field_intro
entity_type: config_pages
bundle: intro_ressources
label: Intro
description: ''
required: false
translatable: false
default_value: { }
default_value_callback: ''
settings:
allowed_formats:
- wysiwyg
field_type: text_long

View File

@@ -0,0 +1,25 @@
uuid: 9f3c0cbe-5562-4660-b4bc-fc9787491962
langcode: fr
status: true
dependencies:
config:
- field.storage.node.field_poid
- node.type.ressource
id: node.ressource.field_poid
field_name: field_poid
entity_type: node
bundle: ressource
label: Poid
description: ''
required: false
translatable: false
default_value:
-
value: 0
default_value_callback: ''
settings:
min: -20
max: 20
prefix: ''
suffix: ''
field_type: integer

View File

@@ -290,7 +290,7 @@ variant_settings:
css_styles: ''
0e71ab04-a5cc-4eca-a7c2-a18fc9d0b7e1:
id: 'entity_field:node:field_projets_lie'
label: 'Les projets sélectionnés'
label: 'Projets finalistes'
label_display: visible
provider: ctools_block
context_mapping:

View File

@@ -104,3 +104,212 @@ blocks:
height: '444'
caption: null
caption_format: null
menus:
-
menu_name: admin
title: 'Intro ressources'
parent: system.admin_content
uri: 'internal:/edit/ressources'
link_title: ''
description: null
enabled: true
expanded: false
weight: 0
langcode: fr
uuid: e28fb66f-21c1-42d3-9d85-ee19e1a28d14
options:
attributes:
class:
- ''
-
menu_name: entete
title: Partenaires
parent: null
uri: 'internal:/partenaires'
link_title: ''
description: null
enabled: true
expanded: false
weight: -46
langcode: fr
uuid: 608ba43c-1931-4ee1-9b6c-bc3637f2a0dc
options:
attributes:
class:
- ''
-
menu_name: entete
title: Contacts
parent: null
uri: 'entity:node/2'
link_title: ''
description: null
enabled: true
expanded: false
weight: -45
langcode: fr
uuid: efdff74d-685c-4f20-8e16-4351cd4f929c
options:
attributes:
class:
- ''
-
menu_name: entete
title: 'Mentions légales'
parent: null
uri: 'entity:node/1'
link_title: ''
description: null
enabled: false
expanded: false
weight: -44
langcode: fr
uuid: 1b21428d-c068-48b3-8cb6-ba3c1113bb59
options:
attributes:
class:
- ''
-
menu_name: entete
title: Présentation
parent: null
uri: 'entity:node/6'
link_title: ''
description: null
enabled: false
expanded: false
weight: -50
langcode: fr
uuid: a833cd74-00fa-46a0-950b-aedc100c908f
options:
attributes:
class:
- ''
-
menu_name: entete
title: 'La consultation'
parent: null
uri: 'entity:node/7'
link_title: ''
description: null
enabled: true
expanded: true
weight: -49
langcode: fr
uuid: 1415f75a-0c82-4d29-9b67-8f0eff863069
options:
attributes:
class:
- ''
-
menu_name: entete
title: 'les 10 Sites'
parent: null
uri: 'internal:/lessites'
link_title: ''
description: null
enabled: true
expanded: false
weight: -48
langcode: fr
uuid: 0c6fa9f3-65f6-403d-a357-6338c532b95e
options:
attributes:
class:
- ''
-
menu_name: entete
title: 'Pour candidater'
parent: null
uri: 'entity:node/44'
link_title: ''
description: null
enabled: false
expanded: false
weight: -47
langcode: fr
uuid: e466f110-e5f7-4a38-bd20-b1be732d9179
options:
attributes:
class:
- ''
-
menu_name: entete
title: 'Les 30 projets'
parent: null
uri: 'internal:/lesprojets'
link_title: ''
description: null
enabled: true
expanded: true
weight: -48
langcode: fr
uuid: da75c27c-9a00-4f16-980a-10f5467bf0ac
options:
attributes:
class:
- ''
-
menu_name: footer
title: 'Mentions légales'
parent: null
uri: 'entity:node/1'
link_title: ''
description: null
enabled: true
expanded: false
weight: -46
langcode: fr
uuid: d95fd71b-4146-4328-b5b5-1e5c66919596
options:
attributes:
class:
- ''
-
menu_name: footer
title: Contacts
parent: null
uri: 'entity:node/2'
link_title: ''
description: null
enabled: true
expanded: false
weight: -47
langcode: fr
uuid: 55c4cb76-62cf-4d80-ad13-84481430b74d
options:
attributes:
class:
- ''
-
menu_name: footer
title: Accueil
parent: null
uri: 'internal:/'
link_title: ''
description: null
enabled: true
expanded: false
weight: -50
langcode: fr
uuid: c1f56a2d-5e1f-492a-92a5-4902ba4eb343
options:
attributes:
class:
- ''
-
menu_name: footer
title: 'La consultation'
parent: null
uri: 'entity:node/7'
link_title: ''
description: null
enabled: true
expanded: false
weight: -49
langcode: fr
uuid: 5e39cdc7-1bf4-4684-869b-87ce57b7dae4
options:
attributes:
class:
- ''

View File

@@ -73,6 +73,7 @@ permissions:
- 'edit deroulement config page entity'
- 'edit diaporama_home config page entity'
- 'edit intro_partenaires config page entity'
- 'edit intro_ressources config page entity'
- 'execute entity:save_action menu_link_content'
- 'execute entity:save_action node'
- 'execute entity:save_action taxonomy_term'

View File

@@ -18,3 +18,4 @@ permissions:
- 'view deroulement config page entity'
- 'view diaporama_home config page entity'
- 'view intro_partenaires config page entity'
- 'view intro_ressources config page entity'

View File

@@ -20,3 +20,4 @@ permissions:
- 'view deroulement config page entity'
- 'view diaporama_home config page entity'
- 'view intro_partenaires config page entity'
- 'view intro_ressources config page entity'

View File

@@ -59,6 +59,7 @@ permissions:
- 'edit deroulement config page entity'
- 'edit diaporama_home config page entity'
- 'edit intro_partenaires config page entity'
- 'edit intro_ressources config page entity'
- 'execute entity:save_action node'
- 'execute node_make_sticky_action node'
- 'execute node_make_unsticky_action node'

View File

@@ -3,6 +3,7 @@ langcode: fr
status: true
dependencies:
config:
- field.storage.node.field_laureats
- field.storage.node.field_nom_de_l_equipe
- node.type.projet
module:
@@ -23,8 +24,73 @@ display:
display_plugin: default
position: 0
display_options:
title: 'Les autres projets sélectionnés'
title: 'Sur le même site de projet'
fields:
field_laureats:
id: field_laureats
table: node__field_laureats
field: field_laureats
relationship: none
group_type: group
admin_label: ''
plugin_id: field
label: ''
exclude: false
alter:
alter_text: false
text: ''
make_link: false
path: ''
absolute: false
external: false
replace_spaces: false
path_case: none
trim_whitespace: false
alt: ''
rel: ''
link_class: ''
prefix: ''
suffix: ''
target: ''
nl2br: false
max_length: 0
word_boundary: true
ellipsis: true
more_link: false
more_link_text: ''
more_link_path: ''
strip_tags: false
trim: false
preserve_tags: ''
html: false
element_type: ''
element_class: ''
element_label_type: ''
element_label_class: ''
element_label_colon: false
element_wrapper_type: ''
element_wrapper_class: ''
element_default_classes: true
empty: ''
hide_empty: false
empty_zero: false
hide_alter_empty: true
click_sort_column: value
type: boolean
settings:
format: custom
format_custom_false: ''
format_custom_true: Lauréat
group_column: value
group_columns: { }
group_rows: true
delta_limit: 0
delta_offset: 0
delta_reversed: false
delta_first_last: false
multi_type: separator
separator: ', '
field_api_classes: false
title:
id: title
table: node_field_data
@@ -368,6 +434,7 @@ display:
- 'user.node_grants:view'
- user.permissions
tags:
- 'config:field.storage.node.field_laureats'
- 'config:field.storage.node.field_nom_de_l_equipe'
block_1:
id: block_1
@@ -409,4 +476,5 @@ display:
- 'user.node_grants:view'
- user.permissions
tags:
- 'config:field.storage.node.field_laureats'
- 'config:field.storage.node.field_nom_de_l_equipe'

View File

@@ -19,6 +19,8 @@ dependencies:
- system.menu.entete
- taxonomy.vocabulary.mots_clefs
- taxonomy.vocabulary.type_de_ressources
content:
- 'config_pages:intro_ressources:85c7dc7e-0448-4073-9c7e-58ab7a809374'
module:
- datetime
- formatter_suite
@@ -1426,6 +1428,33 @@ display:
label: ''
field_identifier: ''
exposed: false
field_poid_value:
id: field_poid_value
table: node__field_poid
field: field_poid_value
relationship: none
group_type: group
admin_label: ''
plugin_id: standard
order: ASC
expose:
label: ''
field_identifier: ''
exposed: false
field_date_ressource_value:
id: field_date_ressource_value
table: node__field_date_ressource
field: field_date_ressource_value
relationship: none
group_type: group
admin_label: ''
plugin_id: datetime
order: ASC
expose:
label: ''
field_identifier: ''
exposed: false
granularity: second
arguments: { }
filters:
status:
@@ -1744,7 +1773,20 @@ display:
admin_label: 'field_type_de_ressource : Terme de taxonomie'
plugin_id: standard
required: true
header: { }
header:
entity_config_pages:
id: entity_config_pages
table: views
field: entity_config_pages
relationship: none
group_type: group
admin_label: ''
plugin_id: entity
empty: false
target: 85c7dc7e-0448-4073-9c7e-58ab7a809374
view_mode: default
tokenize: true
bypass_access: false
footer: { }
display_extenders: { }
cache_metadata:

View File

@@ -494,6 +494,19 @@ display:
options: { }
empty: { }
sorts:
field_poid_value:
id: field_poid_value
table: node__field_poid
field: field_poid_value
relationship: none
group_type: group
admin_label: ''
plugin_id: standard
order: ASC
expose:
label: ''
field_identifier: ''
exposed: false
created:
id: created
table: node_field_data
@@ -510,19 +523,6 @@ display:
field_identifier: ''
exposed: false
granularity: second
field_poid_value:
id: field_poid_value
table: node__field_poid
field: field_poid_value
relationship: none
group_type: group
admin_label: ''
plugin_id: standard
order: DESC
expose:
label: ''
field_identifier: ''
exposed: false
arguments: { }
filters:
status:

View File

@@ -18,18 +18,19 @@
@media (max-width: 810px) {
#sites-map-container {
width: 80%;
}
}
@media (max-width: 530px) {
#sites-map-container {
width: 100%;
height: 485px;
height:396px;
}
}
@media (max-width: 400px) {
#sites-map-container {
width: 100%;
height: 430px;
}
}
#sites-map-container .site-link:hover {

View File

@@ -10,6 +10,8 @@ const isLessitesPage = document.querySelector('div#lessites') !== null;
const isNodeTypeSitePage = document.body.classList.contains('node-type-site');
const isCandidaturePage = document.querySelector('main#pour_candidater') !== null;
const isNodeTypeProjetPage = document.body.classList.contains('node-type-projet');
const isNodeTypeRessourcePage = document.body.classList.contains('node-type-ressource');
// Identifier le cercle de la page courante pour node-type-site
let currentPageCircle = null;
@@ -51,6 +53,29 @@ if (isNodeTypeProjetPage && svgElement) {
}
}
// Identifier le cercle du SITE lié quand on est sur une page node-type-ressource
if (isNodeTypeRessourcePage && svgElement) {
// On récupère le nom du site dans le bloc "Site(s)"
const siteField = document.querySelector('.field_field_site');
if (siteField && siteField.children[1]) {
// children[0] = label "Site(s)", children[1] = wrapper du nom
const siteName = siteField.children[1].textContent.trim(); // ex : "Corbeil-Essonnes, quartier des Tarterêts"
// On cherche le cercle dont le data-content contient ce nom
const correspondingCircle = Array.from(svgElement.querySelectorAll('circle.site-link')).find(circle => {
const content = circle.getAttribute('data-content') || '';
return content.includes(siteName);
});
if (correspondingCircle) {
currentPageCircle = correspondingCircle;
currentPageCircle.setAttribute('fill', 'red'); // Met en rouge le cercle du site lié
}
}
}
// Fonction pour afficher le popup
function showPopup(content) {
@@ -138,25 +163,58 @@ svgElement.addEventListener('mouseout', function(event) {
});
// Gérer les clics pour la page node-type-site uniquement
svgElement.addEventListener('click', function(event) {
if (isNodeTypeSitePage) {
if (event.target.classList.contains('site-link')) {
const targetUrl = event.target.getAttribute('data-url');
if (targetUrl) {
window.location.href = targetUrl; // Redirige vers le data-url correspondant
}
// Gérer les clics sur les cercles de la carte
if (svgElement) {
svgElement.addEventListener('click', function(event) {
const target = event.target;
if (!target.classList || !target.classList.contains('site-link')) {
return;
}
// On récupère les URLs
const missionUrl = target.getAttribute('data-mission-photo-url');
const fallbackUrl = target.getAttribute('data-url');
// 1) Page RESSOURCE : priorité à la mission photo
if (isNodeTypeRessourcePage) {
event.preventDefault(); // empêche le <a href="..."> d'agir
if (missionUrl) {
window.location.href = missionUrl; // Aller directement à la mission photo
} else if (fallbackUrl) {
window.location.href = fallbackUrl; // Sinon, on garde le comportement actuel
}
}
if (isNodeTypeProjetPage) {
if (event.target.classList.contains('site-link')) {
const targetUrl = event.target.getAttribute('data-url');
if (targetUrl) {
window.location.href = targetUrl; // Redirige vers le data-url correspondant
}
return;
}
// 2) Page SITE : comportement actuel
if (isNodeTypeSitePage) {
if (fallbackUrl) {
event.preventDefault();
window.location.href = fallbackUrl;
}
}
});
return;
}
// 3) Page PROJET : comportement actuel
if (isNodeTypeProjetPage) {
if (fallbackUrl) {
event.preventDefault();
window.location.href = fallbackUrl;
}
return;
}
// 4) Autres pages : si tu veux un comportement par défaut
// if (fallbackUrl) {
// event.preventDefault();
// window.location.href = fallbackUrl;
// }
});
}
// Fonction pour gérer l'agrandissement de views-row au survol des cercles
if (isLessitesPage) {

View File

@@ -34,6 +34,34 @@ class GaleriePhotoMap extends BlockBase {
$vp_w = 600;
$vp_h = 600;
// Charger toutes les ressources de type "Mission photo" (type de ressource = 17)
$all_mission_photos = \Drupal::entityTypeManager()
->getStorage('node')
->loadByProperties([
'type' => 'ressource', // adapte si ton type machine est différent
'status' => 1,
'field_type_de_ressource' => 17, // même ID que dans la query de la vue
]);
// Indexer les missions photo par ID de site
$mission_by_site = [];
foreach ($all_mission_photos as $mission) {
if (!$mission->hasField('field_site') || $mission->get('field_site')->isEmpty()) {
continue;
}
// Un même node peut être lié à plusieurs sites : on en prend un par site
foreach ($mission->get('field_site') as $ref) {
$site_id = $ref->target_id;
if (!isset($mission_by_site[$site_id])) {
$mission_by_site[$site_id] = $mission;
}
}
}
// Coordonnées géographiques des coins de la carte (France)
$latTop = 52.0; // Nord-Ouest (coin supérieur gauche)
$lonLeft = -6.0;
@@ -60,6 +88,24 @@ class GaleriePhotoMap extends BlockBase {
// $subtitle = $site->get('field_sous_titre')->getString();
$subtitle = $site->hasTranslation($language) ? $site->getTranslation($language)->get('field_sous_titre')->getString() : $site->get('field_sous_titre')->getString();
// URL directe de la mission photo liée à ce site (si trouvée)
$mission_photo_url = '';
if (isset($mission_by_site[$site->id()])) {
$mission_node = $mission_by_site[$site->id()];
// Respecter la langue courante si traduction existe
if ($mission_node->hasTranslation($language)) {
$mission_node = $mission_node->getTranslation($language);
}
$mission_photo_url = $mission_node->toUrl('canonical', [
'absolute' => TRUE,
'language' => \Drupal::languageManager()->getLanguage($langcode),
])->toString();
}
$link_options = ['absolute' => TRUE, 'attributes' => ['class' => 'ressource-link'], 'language' => \Drupal::languageManager()->getLanguage($langcode)]; // Passer 'absolute' à TRUE
// $site_url = $site->toUrl('canonical', $link_options)->toString(); // URL absolue pour le data-url
$site_link_object = Link::createFromRoute(t("Voir le site"), 'entity.node.canonical', ['node' => $site->id()], $link_options);
@@ -93,6 +139,7 @@ class GaleriePhotoMap extends BlockBase {
class="site-link"
data-content="$datacontent"
data-url="$url"
data-mission-photo-url="$mission_photo_url"
cx="0" cy="0" r="$r"
style="fill-opacity:1;fill-rule:nonzero;" />
<path

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,22 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="14.947381"
height="18.174984"
viewBox="0 0 4.497851 5.4690765"
version="1.1"
id="svg1"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs1" />
<g
id="layer1"
transform="translate(-102.76452,-145.67101)">
<path
d="m 107.0214,148.83607 -1.86476,1.82265 v -4.84236 a 0.14436835,0.14436835 0 1 0 -0.28873,0 v 4.84236 l -1.86476,-1.82265 a 0.14436835,0.14436835 0 0 0 -0.19851,0 0.1503837,0.1503837 0 0 0 0,0.20452 l 2.10537,2.06326 a 0.1624144,0.1624144 0 0 0 0.20452,0 l 2.10538,-2.06326 a 0.14436835,0.14436835 0 0 0 0,-0.20452 0.14436835,0.14436835 0 0 0 -0.19851,0 z"
id="path2-2"
style="fill:#ffffff;stroke-width:0.0601533" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 872 B

View File

@@ -0,0 +1,22 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="14.947379"
height="18.174984"
viewBox="0 0 4.4978504 5.4690765"
version="1.1"
id="svg1"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs1" />
<g
id="layer1"
transform="translate(-102.76452,-145.67101)">
<path
d="m 103.00549,147.97502 1.86476,-1.82265 v 4.84236 a 0.14436835,0.14436835 0 1 0 0.28873,0 v -4.84236 l 1.86476,1.82265 a 0.14436835,0.14436835 0 0 0 0.19851,0 0.1503837,0.1503837 0 0 0 0,-0.20452 l -2.10537,-2.06326 a 0.1624144,0.1624144 0 0 0 -0.20452,0 l -2.10538,2.06326 a 0.14436835,0.14436835 0 0 0 0,0.20452 0.14436835,0.14436835 0 0 0 0.19851,0 z"
id="path2-2"
style="fill:#ffffff;stroke-width:0.0601533" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 872 B

View File

@@ -5,41 +5,10 @@
version="1.1"
id="svg1"
width="1801.0212"
height="4029.4231"
viewBox="0 0 1801.0212 4029.4232"
sodipodi:docname="formes-animees.svg"
inkscape:version="1.4 (e7c3feb100, 2024-10-09)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
height="4008.7539"
viewBox="0 0 1801.0212 4008.754"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:zoom="0.22209622"
inkscape:cx="900.51061"
inkscape:cy="1339.5095"
inkscape:window-width="1920"
inkscape:window-height="1016"
inkscape:window-x="0"
inkscape:window-y="36"
inkscape:window-maximized="1"
inkscape:current-layer="g2">
<inkscape:page
x="0"
y="0"
width="1801.0212"
height="4029.4231"
id="page2"
margin="0"
bleed="0" />
</sodipodi:namedview>
<defs
id="defs1">
<clipPath
@@ -72,21 +41,15 @@
transform="translate(-299.16899,-2519.6031)">
<g
id="g1"
transform="translate(0.17944336,-2.9196463)"
inkscape:export-filename="formes-animees.svg"
inkscape:export-xdpi="300"
inkscape:export-ydpi="300">
transform="translate(0.17944336,-2.9196463)">
<path
id="path256"
d="m 321.27266,3436.1817 182.91889,175.8201"
style="fill:none;stroke:#0833c2;stroke-width:64.3111;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
inkscape:export-filename="formes-animees.svg"
inkscape:export-xdpi="300"
inkscape:export-ydpi="300" />
style="fill:none;stroke:#0833c2;stroke-width:64.3111;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
id="path256-3"
d="m 1852.1683,6336.9184 -163.0856,194.3583"
style="fill:none;stroke:#0833c2;stroke-width:64.3111;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
style="fill:none;stroke:none;stroke-width:64.3111;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
id="path257"
d="M 0,0 C -205.098,0 -371.361,-166.265 -371.361,-371.362"
@@ -102,7 +65,7 @@
<path
id="path302"
d="M 0,0 C 0,126.805 -102.795,229.6 -229.6,229.6"
style="fill:none;stroke:#0833c2;stroke-width:85;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
style="fill:none;stroke:none;stroke-width:85;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
transform="matrix(0.82260013,0,0,-0.82260013,2051.1937,5635.4927)"
clip-path="url(#clipPath303)" />
<path
@@ -117,7 +80,7 @@
width="1550.348"
height="201.3089"
x="122.31378"
y="-9.4031076e-13" />
y="-2.4338836e-20" />
<rect
style="fill:none;stroke:none;stroke-width:0;paint-order:fill markers stroke"
id="rect1"
@@ -137,9 +100,6 @@
id="rect4"
width="1801.0212"
height="442.35608"
x="1.3299257e-06"
y="7.8992786"
inkscape:export-filename="formes-animees.svg"
inkscape:export-xdpi="300"
inkscape:export-ydpi="300" />
x="1.1471996e-08"
y="7.8992786" />
</svg>

Before

Width:  |  Height:  |  Size: 5.0 KiB

After

Width:  |  Height:  |  Size: 3.7 KiB

View File

@@ -13,7 +13,8 @@
},
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"watch": "webpack --watch"
"watch": "webpack --watch",
"build": "webpack --mode production"
},
"keywords": [],
"author": "",

View File

@@ -1,4 +1,4 @@
a<<?php
<?php
use Drupal\Core\Url;

View File

@@ -0,0 +1,415 @@
// // //////// start header ////////////
// // document.addEventListener('DOMContentLoaded', function() {
// // const header = document.querySelector('header[role="banner"]');
// // const logo = document.querySelector('#block-quartiers-de-demain-logoquartiersdedemain > div:nth-child(1) > div:nth-child(1) > a:nth-child(1) > svg:nth-child(1)');
// // const headerNavContainer = document.querySelector('.header_nav_container');
// // const isFirstLoad = !performance.getEntriesByType("navigation")[0].type.includes('back_forward');
// // const isTargetPath = window.location.pathname === '/';
// // // Fonction pour démarrer l'animation du logo SVG
// // function startLogoAnimation() {
// // logo.classList.add('animated');
// // }
// // // Fonction pour arrêter l'animation du logo SVG
// // function stopLogoAnimation() {
// // logo.classList.remove('animated');
// // }
// // // Vérifier si le header a la classe header--collapse
// // function checkHeaderCollapse() {
// // if (header.classList.contains('header--collapsed')) {
// // stopLogoAnimation();
// // } else if (header.classList.contains('header--collapsed-already')) {
// // stopLogoAnimation();
// // } else {
// // startLogoAnimation();
// // }
// // }
// // // Appeler la fonction au chargement initial
// // checkHeaderCollapse();
// // // Observer les changements de classe sur le header
// // const observer = new MutationObserver(function(mutations) {
// // mutations.forEach(function(mutation) {
// // if (mutation.attributeName === 'class') {
// // checkHeaderCollapse();
// // }
// // });
// // });
// // observer.observe(header, { attributes: true });
// // // Si ce n'est pas la première charge ou si le chemin n'est pas le chemin cible, ajouter la classe immédiatement
// // if (!isFirstLoad || !isTargetPath) {
// // header.classList.add('header--collapsed-already');
// // stopLogoAnimation();
// // } else {
// // // Sinon, appliquer la transition après un délai, sauf si scroll
// // let collapseTimeout = setTimeout(() => {
// // header.classList.add('header--collapsed');
// // }, 1000);
// // function interruptCollapseOnScroll() {
// // if (!header.classList.contains('header--collapsed')) {
// // clearTimeout(collapseTimeout); // annule l'animation
// // header.classList.add('header--collapsed');
// // }
// // window.removeEventListener('scroll', interruptCollapseOnScroll); // une seule fois
// // }
// // window.addEventListener('scroll', interruptCollapseOnScroll);
// // }
// // //////////////////////////////////////
// // let lastScrollTop = 0;
// // let threshold = 100; // Change this value as needed
// // let isHidden = false;
// // function slideOut() {
// // headerNavContainer.animate([
// // { transform: 'translateX(0)' },
// // { transform: 'translateX(-100%)' }
// // ], {
// // duration: 300,
// // fill: 'forwards'
// // });
// // isHidden = true;
// // }
// // function slideIn() {
// // headerNavContainer.animate([
// // { transform: 'translateX(-100%)' },
// // { transform: 'translateX(0)' }
// // ], {
// // duration: 300,
// // fill: 'forwards'
// // });
// // isHidden = false;
// // }
// // function slideDown() {
// // // headerNavContainer.style.display = 'block';
// // headerNavContainer.animate([
// // { transform: 'translateY(0%)' },
// // { transform: 'translateY(+100%)' }
// // ], {
// // duration: 300,
// // fill: 'forwards'
// // });
// // isHidden = false;
// // }
// // function slideUp() {
// // headerNavContainer.animate([
// // { transform: 'translateY(100%)' },
// // { transform: 'translateY(0%)' }
// // ], {
// // duration: 300,
// // fill: 'forwards'
// // }).onfinish = function() {
// // // headerNavContainer.style.display = 'none';
// // };
// // isHidden = true;
// // }
// // // Fonction pour ajuster la hauteur du header lors du défilement
// // function adjustHeaderHeight() {
// // if (window.scrollY > 0) {
// // header.classList.add('shrink');
// // } else {
// // header.classList.remove('shrink');
// // }
// // }
// // function handleScroll() {
// // let scrollTop = window.pageYOffset || document.documentElement.scrollTop;
// // const isMobile = window.innerWidth < 811;
// // if (scrollTop > threshold && !isHidden) {
// // if (isMobile) {
// // slideUp();
// // } else {
// // slideOut();
// // }
// // } else if (scrollTop <= threshold && isHidden) {
// // if (isMobile) {
// // slideDown();
// // } else {
// // slideIn();
// // }
// // }
// // lastScrollTop = scrollTop <= 0 ? 0 : scrollTop; // For Mobile or negative scrolling
// // }
// // function handleTouchAndMouseEnter() {
// // if (isHidden) {
// // if (window.innerWidth < 811) {
// // slideDown();
// // } else {
// // slideIn();
// // }
// // }
// // }
// // function handleTouchAndMouseLeave() {
// // if (lastScrollTop > threshold && !isHidden) {
// // if (window.innerWidth < 811) {
// // slideUp();
// // } else {
// // slideOut();
// // }
// // }
// // }
// // window.addEventListener('scroll', handleScroll);
// // window.addEventListener('scroll', adjustHeaderHeight);
// // // Mouse events for desktop
// // header.addEventListener('mouseenter', handleTouchAndMouseEnter);
// // header.addEventListener('mouseleave', handleTouchAndMouseLeave);
// // // Touch events for tablets and mobile devices
// // header.addEventListener('touchstart', handleTouchAndMouseEnter);
// // header.addEventListener('touchend', handleTouchAndMouseLeave);
// // // Initial check to see if we're at the top of the page
// // if (window.pageYOffset <= threshold) {
// // if (window.innerWidth < 811) {
// // slideDown();
// // } else {
// // slideIn();
// // }
// // } else {
// // if (window.innerWidth < 811) {
// // slideUp();
// // } else {
// // slideIn();
// // }
// // }
// // });
// // //////// end header ////////////
///////////////start header sans animation logo////////////////
document.addEventListener('DOMContentLoaded', function() {
const header = document.querySelector('header[role="banner"]');
const logo = document.querySelector('#block-quartiers-de-demain-logoquartiersdedemain svg');
const headerNavContainer = document.querySelector('.header_nav_container');
const navEntry = performance.getEntriesByType("navigation")[0];
const isFirstLoad = !navEntry.type.includes('back_forward');
const isTargetPath = window.location.pathname === '/';
const isMobile = window.innerWidth < 811; // 🔹 breakpoint mobile
const threshold = 100;
let lastScrollTop = 0;
let isHidden = false;
let introDone = false; // ✅ on saura quand l'intro est finie
// 🔹 On cache la nav au tout début (pour éviter toute secousse)
if (headerNavContainer) {
headerNavContainer.style.visibility = 'hidden';
}
/* -------------------
Animations nav
------------------- */
function slideOut() {
headerNavContainer.animate([
{ transform: 'translateX(0)' },
{ transform: 'translateX(-100%)' }
], {
duration: 300,
fill: 'forwards'
});
isHidden = true;
}
function slideIn() {
headerNavContainer.animate([
{ transform: 'translateX(-100%)' },
{ transform: 'translateX(0)' }
], {
duration: 300,
fill: 'forwards'
});
isHidden = false;
}
function slideDown() {
headerNavContainer.animate([
{ transform: 'translateY(0%)' },
{ transform: 'translateY(+100%)' }
], {
duration: 300,
fill: 'forwards'
});
isHidden = false;
}
function slideUp() {
headerNavContainer.animate([
{ transform: 'translateY(100%)' },
{ transform: 'translateY(0%)' }
], {
duration: 300,
fill: 'forwards'
}).onfinish = function() {};
isHidden = true;
}
// ✅ Position initiale de la nav,
// appelée UNIQUEMENT après la fin de l'intro
function initNavPosition() {
if (window.pageYOffset <= threshold) {
if (window.innerWidth < 811) {
slideDown();
} else {
slideIn();
}
} else {
if (window.innerWidth < 811) {
slideUp();
} else {
slideIn();
}
}
}
/* -------------------
Scroll / resize header
------------------- */
function adjustHeaderHeight() {
if (window.scrollY > 0) {
header.classList.add('shrink');
} else {
header.classList.remove('shrink');
}
}
function handleScroll() {
if (!introDone) return; // ⛔ rien tant que l'intro n'est pas finie
let scrollTop = window.pageYOffset || document.documentElement.scrollTop;
const isMobile = window.innerWidth < 811;
if (scrollTop > threshold && !isHidden) {
if (isMobile) {
slideUp();
} else {
slideOut();
}
} else if (scrollTop <= threshold && isHidden) {
if (isMobile) {
slideDown();
} else {
slideIn();
}
}
lastScrollTop = scrollTop <= 0 ? 0 : scrollTop;
}
function handleTouchAndMouseEnter() {
if (!introDone) return; // ⛔ pas de hover avant la fin de l'intro
if (isHidden) {
if (window.innerWidth < 811) {
slideDown();
} else {
slideIn();
}
}
}
function handleTouchAndMouseLeave() {
if (!introDone) return;
if (lastScrollTop > threshold && !isHidden) {
if (window.innerWidth < 811) {
slideUp();
} else {
slideOut();
}
}
}
window.addEventListener('scroll', handleScroll);
window.addEventListener('scroll', adjustHeaderHeight);
header.addEventListener('mouseenter', handleTouchAndMouseEnter);
header.addEventListener('mouseleave', handleTouchAndMouseLeave);
header.addEventListener('touchstart', handleTouchAndMouseEnter);
header.addEventListener('touchend', handleTouchAndMouseLeave);
/* -------------------
Intro du logo
------------------- */
if (isFirstLoad && isTargetPath && logo && !isMobile) {
// On bloque le scroll
document.body.classList.add('logo-intro-animating');
// 1) Logo plein écran SANS ANIMATION + header figé
logo.style.transition = 'none';
header.style.transition = 'none';
document.body.classList.add('logo-intro-active'); // logo centré, scale(2)
void logo.offsetWidth; // reflow
const INTRO_DELAY = 1000; // temps où le logo reste plein écran
const TRANSITION_DURATION = 1000; // durée de l'anim de collapse
// 2) Après ce délai : on réactive les transitions et on lance l'anim
setTimeout(() => {
logo.style.transition = '';
header.style.transition = '';
header.classList.add('header--collapsed'); // header se rétracte
document.body.classList.remove('logo-intro-active'); // logo retourne dans le header
// 3) Quand le header + logo ont fini de bouger :
setTimeout(() => {
document.body.classList.remove('logo-intro-animating');
introDone = true;
// 👉 maintenant seulement on affiche la nav et on la fait glisser
if (headerNavContainer) {
headerNavContainer.style.visibility = 'visible';
}
initNavPosition();
}, TRANSITION_DURATION + 100);
}, INTRO_DELAY);
} else {
// 🔹 CAS MOBILE OU PAS HOME / PAS 1re LOAD :
// pas d'intro : header direct réduit, nav directement dispo
header.classList.add('header--collapsed-already');
introDone = true;
if (headerNavContainer) {
headerNavContainer.style.visibility = 'visible';
}
initNavPosition();
}
});
///////////////end header sans animation logo////////////////

View File

@@ -0,0 +1,126 @@
//////////////// start lightbox galerie image page site////////////////////////
// Sélection des images à ouvrir dans la lightbox
let images = document.querySelectorAll('.paragraph--type--site-diapo .lightbox-trigger, .paragraph--type--projet-diapo .lightbox-trigger, .field_field_images .lightbox-trigger');
let currentIndex;
// Création de la lightbox
const lightbox = document.createElement('div');
lightbox.id = 'lightbox';
lightbox.classList.add('lightbox');
document.body.appendChild(lightbox);
// Image affichée dans la lightbox
const img = document.createElement('img');
img.classList.add('lightbox-content');
lightbox.appendChild(img);
// Légende
const caption = document.createElement('p');
caption.classList.add('caption');
lightbox.appendChild(caption);
// Bouton de fermeture
const closeBtn = document.createElement('span');
closeBtn.classList.add('close');
closeBtn.innerHTML = '&times;';
lightbox.appendChild(closeBtn);
// Bouton précédent avec image
const prevBtn = document.createElement('a');
prevBtn.classList.add('prev');
const prevImg = document.createElement('img');
prevImg.src = "/themes/custom/quartiers_de_demain/dist/assets/img/prev-blanc.svg"; // 🔁 adapte ce chemin
prevImg.alt = 'Précédent';
prevBtn.appendChild(prevImg);
lightbox.appendChild(prevBtn);
// Bouton suivant avec image
const nextBtn = document.createElement('a');
nextBtn.classList.add('next');
const nextImg = document.createElement('img');
nextImg.src = '/themes/custom/quartiers_de_demain/dist/assets/img/next-blanc.svg'; // 🔁 adapte ce chemin
nextImg.alt = 'Suivant';
nextBtn.appendChild(nextImg);
lightbox.appendChild(nextBtn);
// Fonction d'affichage
function showImage(index) {
if (index < 0) index = images.length - 1;
if (index >= images.length) index = 0;
currentIndex = index;
const currentImg = images[currentIndex];
// 👉 1. Utiliser l'IMAGE ORIGINALE (href du <a>) si possible
const parentLink = currentImg.closest('a');
if (parentLink && parentLink.getAttribute('href')) {
img.src = parentLink.getAttribute('href');
} else {
img.src = currentImg.getAttribute('src');
}
// 👉 2. Trouver le conteneur qui porte la légende
// - Cas 1 : <div><div class="cadre-img-zoom"><img></div><blockquote class="image-field-caption">...</blockquote></div>
// - Cas 2 : <div class="images"><a><img></a><blockquote class="image-field-caption">...</blockquote></div>
const wrapper =
currentImg.closest('.cadre-img-zoom')?.parentElement || // cas 1
currentImg.closest('.images'); // cas 2
let captionText =
wrapper?.querySelector('.image-field-caption p')?.textContent ||
currentImg.alt || // fallback si pas de blockquote
'';
caption.textContent = captionText;
lightbox.style.display = 'flex';
}
// Clic sur une image
images.forEach((image, index) => {
image.addEventListener('click', (e) => {
e.preventDefault(); // empêche le <a> de s'ouvrir
e.stopPropagation(); // empêche des comportements externes
showImage(index);
});
// 🔒 Empêche le clic sur le <a> parent d'agir aussi
const parentLink = image.closest('a');
if (parentLink) {
parentLink.addEventListener('click', (e) => {
e.preventDefault();
e.stopPropagation();
});
}
});
// Navigation & fermeture
closeBtn.addEventListener('click', () => lightbox.style.display = 'none');
prevBtn.addEventListener('click', (e) => {
e.stopPropagation();
showImage(currentIndex - 1);
});
nextBtn.addEventListener('click', (e) => {
e.stopPropagation();
showImage(currentIndex + 1);
});
// Clic en dehors de l'image pour fermer
lightbox.addEventListener('click', (e) => {
if (e.target === lightbox) lightbox.style.display = 'none';
});
// Clavier
document.addEventListener('keydown', (e) => {
if (lightbox.style.display === 'flex') {
if (e.key === 'Escape') lightbox.style.display = 'none';
else if (e.key === 'ArrowLeft') showImage(currentIndex - 1);
else if (e.key === 'ArrowRight') showImage(currentIndex + 1);
}
});
//////////////// end lightbox galerie image page site////////////////////////

View File

@@ -14,212 +14,6 @@
} (Drupal));
//////// start header ////////////
document.addEventListener('DOMContentLoaded', function() {
const header = document.querySelector('header[role="banner"]');
const logo = document.querySelector('#block-quartiers-de-demain-logoquartiersdedemain > div:nth-child(1) > div:nth-child(1) > a:nth-child(1) > svg:nth-child(1)');
const headerNavContainer = document.querySelector('.header_nav_container');
const isFirstLoad = !performance.getEntriesByType("navigation")[0].type.includes('back_forward');
const isTargetPath = window.location.pathname === '/';
// Fonction pour démarrer l'animation du logo SVG
function startLogoAnimation() {
logo.classList.add('animated');
}
// Fonction pour arrêter l'animation du logo SVG
function stopLogoAnimation() {
logo.classList.remove('animated');
}
// Vérifier si le header a la classe header--collapse
function checkHeaderCollapse() {
if (header.classList.contains('header--collapsed')) {
stopLogoAnimation();
} else if (header.classList.contains('header--collapsed-already')) {
stopLogoAnimation();
} else {
startLogoAnimation();
}
}
// Appeler la fonction au chargement initial
checkHeaderCollapse();
// Observer les changements de classe sur le header
const observer = new MutationObserver(function(mutations) {
mutations.forEach(function(mutation) {
if (mutation.attributeName === 'class') {
checkHeaderCollapse();
}
});
});
observer.observe(header, { attributes: true });
// Si ce n'est pas la première charge ou si le chemin n'est pas le chemin cible, ajouter la classe immédiatement
if (!isFirstLoad || !isTargetPath) {
header.classList.add('header--collapsed-already');
// logo.classList.remove('animated');
stopLogoAnimation();
// } else {
// // Sinon, appliquer la transition après un délai
// setTimeout(() => {
// header.classList.add('header--collapsed');
// }, 5000);
// }
} else {
// Sinon, appliquer la transition après un délai, sauf si scroll
let collapseTimeout = setTimeout(() => {
header.classList.add('header--collapsed');
}, 5000);
function interruptCollapseOnScroll() {
if (!header.classList.contains('header--collapsed')) {
clearTimeout(collapseTimeout); // annule l'animation
header.classList.add('header--collapsed');
}
window.removeEventListener('scroll', interruptCollapseOnScroll); // une seule fois
}
window.addEventListener('scroll', interruptCollapseOnScroll);
}
//////////////////////////////////////
let lastScrollTop = 0;
let threshold = 100; // Change this value as needed
let isHidden = false;
function slideOut() {
headerNavContainer.animate([
{ transform: 'translateX(0)' },
{ transform: 'translateX(-100%)' }
], {
duration: 300,
fill: 'forwards'
});
isHidden = true;
}
function slideIn() {
headerNavContainer.animate([
{ transform: 'translateX(-100%)' },
{ transform: 'translateX(0)' }
], {
duration: 300,
fill: 'forwards'
});
isHidden = false;
}
function slideDown() {
// headerNavContainer.style.display = 'block';
headerNavContainer.animate([
{ transform: 'translateY(0%)' },
{ transform: 'translateY(+100%)' }
], {
duration: 300,
fill: 'forwards'
});
isHidden = false;
}
function slideUp() {
headerNavContainer.animate([
{ transform: 'translateY(100%)' },
{ transform: 'translateY(0%)' }
], {
duration: 300,
fill: 'forwards'
}).onfinish = function() {
// headerNavContainer.style.display = 'none';
};
isHidden = true;
}
// Fonction pour ajuster la hauteur du header lors du défilement
function adjustHeaderHeight() {
if (window.scrollY > 0) {
header.classList.add('shrink');
} else {
header.classList.remove('shrink');
}
}
function handleScroll() {
let scrollTop = window.pageYOffset || document.documentElement.scrollTop;
const isMobile = window.innerWidth < 811;
if (scrollTop > threshold && !isHidden) {
if (isMobile) {
slideUp();
} else {
slideOut();
}
} else if (scrollTop <= threshold && isHidden) {
if (isMobile) {
slideDown();
} else {
slideIn();
}
}
lastScrollTop = scrollTop <= 0 ? 0 : scrollTop; // For Mobile or negative scrolling
}
function handleTouchAndMouseEnter() {
if (isHidden) {
if (window.innerWidth < 811) {
slideDown();
} else {
slideIn();
}
}
}
function handleTouchAndMouseLeave() {
if (lastScrollTop > threshold && !isHidden) {
if (window.innerWidth < 811) {
slideUp();
} else {
slideOut();
}
}
}
window.addEventListener('scroll', handleScroll);
window.addEventListener('scroll', adjustHeaderHeight);
// Mouse events for desktop
header.addEventListener('mouseenter', handleTouchAndMouseEnter);
header.addEventListener('mouseleave', handleTouchAndMouseLeave);
// Touch events for tablets and mobile devices
header.addEventListener('touchstart', handleTouchAndMouseEnter);
header.addEventListener('touchend', handleTouchAndMouseLeave);
// Initial check to see if we're at the top of the page
if (window.pageYOffset <= threshold) {
if (window.innerWidth < 811) {
slideDown();
} else {
slideIn();
}
} else {
if (window.innerWidth < 811) {
slideUp();
} else {
slideIn();
}
}
});
//////// end header ////////////
@@ -295,99 +89,11 @@ document.addEventListener('DOMContentLoaded', function() {
//////////////////////// end script smooth apparition des textes /////////////////
// //////////////////// start Timeline script ///////////////////////
// Update month field to only show the first 3 letters
document.querySelectorAll('.paragraph--type--phase-deroulement').forEach(function(paragraph) {
const monthField = paragraph.querySelector('.field_field_date_de_moi div:nth-of-type(2)');
if (monthField) {
const monthText = monthField.textContent.trim();
if (monthText === "juillet") {
monthField.textContent = monthText.slice(0, 4);
monthField.classList.add('after');
} else if (monthText === "juin") {
monthField.textContent = monthText.slice(0, 4);
} else if (monthText.length > 3) {
monthField.textContent = monthText.slice(0, 3);
monthField.classList.add('after');
}
}
});
// Fonction pour ajouter ou retirer la classe .only
function updateDateClasses() {
document.querySelectorAll('.paragraph--type--phase-deroulement .date').forEach(function(dateElement) {
const date2Element = dateElement.querySelector('.date2');
const yearElement = dateElement.querySelector('.field_field_date_de_annee');
if (date2Element && !date2Element.textContent.trim()) {
if (yearElement) {
yearElement.classList.add('only');
}
} else {
if (yearElement) {
yearElement.classList.remove('only');
}
}
});
}
// Exécuter la fonction une première fois pour le contenu déjà présent
updateDateClasses();
// MutationObserver pour surveiller les changements dans le DOM
const observer = new MutationObserver(function(mutationsList, observer) {
for(let mutation of mutationsList) {
if (mutation.type === 'childList') {
updateDateClasses();
}
}
});
$(document).ready(function(){
// ////////////////////// start calendrier home /////////////////////////////////
// Aller au 9e élément à l'initialisation
$('.__timeline-content').on('init', function(event, slick){
slick.slickGoTo(11); // Index 8 = 9e item
});
$('.__timeline-content').slick({
slidesToShow: 3,
slidesToScroll: 1,
dots: false,
arrows: true,
centerMode: false,
draggable: true,
infinite: false,
responsive: [
{
breakpoint: 810,
settings: {
slidesToShow: 1,
adaptiveHeight: false,
arrows: true,
draggable: true,
centerMode: false,
infinite: false,
}
}]
});
console.log('salut slick calendrier');
//////////////////////// end calendrier home /////////////////////////////////
//////////////////////// end Timeline script /////////////////////////////////////////////
//////////// start slideshow images home //////////////////////////
$(document).ready(function(){
let diapohome = $('.config_pages--type--diaporama-home .diaporama');
if (diapohome.length) {
@@ -458,106 +164,6 @@ document.addEventListener('DOMContentLoaded', function() {
//////////////// start lightbox galerie image page site////////////////////////
// Sélection des images à ouvrir dans la lightbox
let images = document.querySelectorAll('.paragraph--type--site-diapo .lightbox-trigger, .paragraph--type--projet-diapo .lightbox-trigger, .field_field_images .lightbox-trigger');
let currentIndex;
// Création de la lightbox
const lightbox = document.createElement('div');
lightbox.id = 'lightbox';
lightbox.classList.add('lightbox');
document.body.appendChild(lightbox);
// Image affichée dans la lightbox
const img = document.createElement('img');
img.classList.add('lightbox-content');
lightbox.appendChild(img);
// Légende
const caption = document.createElement('p');
caption.classList.add('caption');
lightbox.appendChild(caption);
// Bouton de fermeture
const closeBtn = document.createElement('span');
closeBtn.classList.add('close');
closeBtn.innerHTML = '&times;';
lightbox.appendChild(closeBtn);
// Bouton précédent avec image
const prevBtn = document.createElement('a');
prevBtn.classList.add('prev');
const prevImg = document.createElement('img');
prevImg.src = "/themes/custom/quartiers_de_demain/dist/assets/img/prev-blanc.svg"; // 🔁 adapte ce chemin
prevImg.alt = 'Précédent';
prevBtn.appendChild(prevImg);
lightbox.appendChild(prevBtn);
// Bouton suivant avec image
const nextBtn = document.createElement('a');
nextBtn.classList.add('next');
const nextImg = document.createElement('img');
nextImg.src = '/themes/custom/quartiers_de_demain/dist/assets/img/next-blanc.svg'; // 🔁 adapte ce chemin
nextImg.alt = 'Suivant';
nextBtn.appendChild(nextImg);
lightbox.appendChild(nextBtn);
// Fonction d'affichage
function showImage(index) {
if (index < 0) index = images.length - 1;
if (index >= images.length) index = 0;
currentIndex = index;
img.src = images[currentIndex].getAttribute('src');
const captionText = images[currentIndex]
.closest('.cadre-img-zoom')
?.nextElementSibling?.querySelector('.image-field-caption p')
?.textContent || '';
caption.textContent = captionText;
lightbox.style.display = 'flex';
}
// Clic sur une image
images.forEach((image, index) => {
image.addEventListener('click', (e) => {
e.preventDefault(); // empêche le <a> de naviguer
e.stopPropagation(); // (optionnel) empêche d'autres handlers de se déclencher
showImage(index);
});
});
// Navigation & fermeture
closeBtn.addEventListener('click', () => lightbox.style.display = 'none');
prevBtn.addEventListener('click', (e) => {
e.stopPropagation();
showImage(currentIndex - 1);
});
nextBtn.addEventListener('click', (e) => {
e.stopPropagation();
showImage(currentIndex + 1);
});
// Clic en dehors de l'image pour fermer
lightbox.addEventListener('click', (e) => {
if (e.target === lightbox) lightbox.style.display = 'none';
});
// Clavier
document.addEventListener('keydown', (e) => {
if (lightbox.style.display === 'flex') {
if (e.key === 'Escape') lightbox.style.display = 'none';
else if (e.key === 'ArrowLeft') showImage(currentIndex - 1);
else if (e.key === 'ArrowRight') showImage(currentIndex + 1);
}
});
//////////////// end lightbox galerie image page site////////////////////////
//////////////////// start wrapper views-row lessites /////////////////////////
@@ -688,6 +294,8 @@ if (documentsLiensWrapper && blockRegionThird) {
}
});
/////////////////// start langswitcher position responsive//////////////////////
document.addEventListener("DOMContentLoaded", function () {
// Fonction pour déplacer le bloc en fonction de la taille de l'écran
@@ -714,109 +322,7 @@ window.addEventListener("resize", moveLanguageSwitcher);
/////////////////// end langswitcher position responsive///////////////////////////////////////////////////////////
/////////////// start class à view-rows-ressources ////////
$(document).ready(function () {
$(".view-rows-wrapper").each(function () {
let h3Container = $(this).prev("h3").find("div[class^='type-']");
let classToAdd = h3Container.attr("class"); // Récupère la classe complète (ex: "type-Documentation")
if (classToAdd) {
$(this).addClass(classToAdd); // Ajoute cette classe à .view-rows-wrapper
}
});
////////////////// end class à view-rows-wrapper ////////////////
/////////////////// start voir plus... ressources ////////////////////
// Vérifier si on est sur la page avec l'ID #ressources
if ($("#ressources").length > 0) {
$(".view-rows-wrapper").each(function () {
let container = $(this); // Cible uniquement cette section
let items = container.find(".views-row"); // Les éléments à afficher progressivement
let visibleCount = 4; // Nombre d'éléments visibles au départ (par défaut)
// Récupérer la classe `type-XXX`
let typeClass = container.attr("class").split(" ").find(cls => cls.startsWith("type-"));
let typeName = typeClass ? typeClass.replace("type-", "").replace(/-/g, " ") : "contenu"; // Nettoyer le nom
// >>> Exception : tout afficher pour type-Galerie-photos (pas de bouton)
if (typeClass && typeClass.toLowerCase() === "type-galerie-photos") {
items.show(); // aucun masquage
return; // on sort : pas de "voir plus"
}
// Ajuster le nombre d'éléments visibles en fonction du type
if (typeClass && (typeClass === "type-podcast" || typeClass.toLowerCase() === "type-vidéo")) {
visibleCount = 2; // Pour Podcast et Vidéo
} else if (typeClass === "type-kit-de-communication") {
visibleCount = 1; // Pour Kit de Communication
}
// Si le nombre total d'éléments est inférieur ou égal à la limite, ne pas ajouter le bouton
if (items.length <= visibleCount) {
return; // Sortir de la boucle
}
// Ajouter le bouton dynamiquement après chaque `.view-rows-wrapper`
let button = $("<button>")
.addClass("voir-plus")
.text("Voir plus de " + typeName)
.insertAfter(container);
// Cacher tous les éléments sauf ceux définis par `visibleCount`
items.hide().slice(0, visibleCount).show();
// Action sur le bouton
button.on("click", function () {
let hiddenItems = container.find(".views-row:hidden").slice(0, 4); // Prochains éléments à afficher
if ($(this).text().includes("Voir plus")) {
hiddenItems.slideDown(); // Afficher avec un effet de glissement
if (container.find(".views-row:hidden").length === 0) {
$(this).text("Voir moins de " + typeName); // Changer le texte du bouton si tout est affiché
}
} else {
container.find(".views-row").slice(visibleCount).slideUp(); // Replier les éléments
$(this).text("Voir plus de " + typeName); // Revenir à l'état initial
}
});
});
// slimselect
let ressource_type_select = new SlimSelect({
select: '#edit-field-type-de-ressource-target-id--2',
settings:{
placeholderText: 'choisir',
searchPlaceholder: 'choisir'
}
})
let ressource_motscles_select = new SlimSelect({
select: '#edit-field-mots-clefs-target-id--2',
settings:{
placeholderText: 'choisir',
searchPlaceholder: 'choisir'
}
})
let ressource_sites_select = new SlimSelect({
select: '#edit-field-site-target-id-verf--2',
settings:{
placeholderText: 'choisir',
searchPlaceholder: 'choisir'
}
})
// console.log(('sites_select'), sites_select);
}
/////////////////// end voir plus... ressources ////////////////////
/////////////////// start voir plus... actualite dans /actualites & /home ////////////////////
@@ -824,23 +330,45 @@ $(document).ready(function () {
if ($("#actualites" ).length > 0 || $("#home").length > 0) {
$(".node-type-actualite").each(function () {
let article = $(this);
let body = article.find(".field_body");
let links = article.find(".field_field_liens");
body.hide();
links.hide();
let toggleButton = $("<button>")
.addClass("toggle-actualite")
.insertAfter(article);
toggleButton.on("click", function () {
// Fonction de toggle (à utiliser partout)
function toggleActu() {
body.slideToggle();
links.slideToggle();
$(this).toggleClass("open");
toggleButton.toggleClass("open");
}
// Clic sur le bouton
toggleButton.on("click", function (e) {
e.stopPropagation();
toggleActu();
});
});
// Clic sur le node entier sauf liens
article.on("click", function (e) {
if ($(e.target).closest("a").length) {
return;
}
toggleActu();
});
// 👉 Clic aussi sur le H2
article.find("h2").on("click", function (e) {
e.stopPropagation();
toggleActu();
});
});
// slimselect
// duplicated due to embeded view (archives)
let actu_type_select = new SlimSelect({
@@ -876,17 +404,6 @@ $(document).ready(function () {
/////////////////// end voir plus... actualite dans /actualites & /home ////////////////////
/////////////// start class à view-rows-ressources ////////
$(".view-rows-wrapper").each(function () {
let h3Container = $(this).prev("h3").find("div[class^='type-']");
let classToAdd = h3Container.attr("class"); // Récupère la classe complète (ex: "type-Documentation")
if (classToAdd) {
$(this).addClass(classToAdd); // Ajoute cette classe à .view-rows-wrapper
}
});
////////////////// end class à view-rows-wrapper ////////////////
//////////////start toggle partenaire //////////////////
@@ -916,38 +433,82 @@ $(document).ready(function () {
////////////// start toggle page node projet //////////////////
document.addEventListener('DOMContentLoaded', function () {
const photo = document.querySelector('.field_field_equipe_photo');
const pres = document.querySelector('.field_field_equipe_presentation');
if (!pres) return;
if (!photo || !pres) return;
// Création du bouton
// 🔒 Forcer l'état FERMÉ au chargement
photo.classList.remove('is-open');
pres.classList.remove('is-open');
// 1. Créer un wrapper autour de photo + présentation
const panel = document.createElement('div');
panel.className = 'equipe-panel';
// Insérer le panel avant la photo, puis y déplacer photo + pres
photo.parentNode.insertBefore(panel, photo);
panel.appendChild(photo);
panel.appendChild(pres);
// 2. Préparer le panel pour l'animation
panel.style.overflow = 'hidden';
panel.style.maxHeight = '0px';
// 3. Création du bouton
const btn = document.createElement('button');
btn.className = 'btn-equipe-toggle';
btn.textContent = "EN SAVOIR PLUS SUR L'ÉQUIPE";
btn.setAttribute('aria-expanded', false);
btn.setAttribute('aria-expanded', 'false');
// Insertion du bouton juste après le bloc présentation
pres.insertAdjacentElement('afterend', btn);
// Insertion du bouton juste après le panel (et plus après "pres")
panel.insertAdjacentElement('afterend', btn);
// 3. Ajout de la ligne après le bouton
const separator = document.createElement('div');
separator.className = 'equipe-separator';
btn.insertAdjacentElement('afterend', separator);
// Ligne de séparation après le bouton
const separator = document.createElement('div');
separator.className = 'equipe-separator';
btn.insertAdjacentElement('afterend', separator);
// Toggle
// --- Fonctions ouverture / fermeture ---
function openPanel() {
panel.classList.add('is-open');
photo.classList.add('is-open');
pres.classList.add('is-open');
const fullHeight = panel.scrollHeight; // inclut photo + texte
panel.style.maxHeight = fullHeight + 'px';
btn.textContent = "FERMER LA PRÉSENTATION DE L'ÉQUIPE";
btn.setAttribute('aria-expanded', 'true');
}
function closePanel() {
const fullHeight = panel.scrollHeight;
panel.style.maxHeight = fullHeight + 'px';
requestAnimationFrame(() => {
panel.style.maxHeight = '0px';
panel.classList.remove('is-open');
photo.classList.remove('is-open');
pres.classList.remove('is-open');
});
btn.textContent = "EN SAVOIR PLUS SUR L'ÉQUIPE";
btn.setAttribute('aria-expanded', 'false');
}
// --- Toggle bouton ---
btn.addEventListener('click', function () {
const isOpen = pres.classList.toggle('is-open');
if (photo) photo.classList.toggle('is-open');
btn.textContent = isOpen
? "FERMER LA PRÉSENTATION DE L'ÉQUIPE"
: "EN SAVOIR PLUS SUR L'ÉQUIPE";
btn.setAttribute('aria-expanded', isOpen);
const isOpen = btn.getAttribute('aria-expanded') === 'true';
if (isOpen) {
closePanel();
} else {
openPanel();
}
});
});
@@ -957,6 +518,8 @@ btn.insertAdjacentElement('afterend', separator);
})(jQuery, window);

View File

@@ -0,0 +1,151 @@
/**
* @file
* quartiers_de_demain behaviors.
*/
(function (Drupal) {
'use strict';
Drupal.behaviors.quartiers_de_demain = {
attach: function (context, settings) {
console.log('It works!');
}
};
} (Drupal));
(function($, window) {
$(document).ready(function () {
/////////////// start class à view-rows-ressources ////////
$(".view-rows-wrapper").each(function () {
let h3Container = $(this).prev("h3").find("div[class^='type-']");
let classToAdd = h3Container.attr("class"); // Récupère la classe complète (ex: "type-Documentation")
if (classToAdd) {
$(this).addClass(classToAdd); // Ajoute cette classe à .view-rows-wrapper
}
});
////////////////// end class à view-rows-wrapper ////////////////
/////////////////// start voir plus... ressources ////////////////////
// Vérifier si on est sur la page avec l'ID #ressources
if ($("#ressources").length > 0) {
$(".view-rows-wrapper").each(function () {
let container = $(this); // Cible uniquement cette section
let items = container.find(".views-row"); // Les éléments à afficher progressivement
let visibleCount = 4; // Nombre d'éléments visibles au départ (par défaut)
// Récupérer la classe `type-XXX`
let typeClass = container.attr("class").split(" ").find(cls => cls.startsWith("type-"));
let typeName = typeClass ? typeClass.replace("type-", "").replace(/-/g, " ") : "contenu"; // Nettoyer le nom
// >>> Exception : tout afficher pour type-Galerie-photos (pas de bouton)
if (typeClass && typeClass.toLowerCase() === "type-mission-photo") {
items.show(); // aucun masquage
return; // on sort : pas de "voir plus"
}
// Ajuster le nombre d'éléments visibles en fonction du type
if (typeClass && (typeClass === "type-podcast" || typeClass.toLowerCase() === "type-vidéo")) {
visibleCount = 2; // Pour Podcast et Vidéo
} else if (typeClass === "type-kit-de-communication") {
visibleCount = 1; // Pour Kit de Communication
}
// Si le nombre total d'éléments est inférieur ou égal à la limite, ne pas ajouter le bouton
if (items.length <= visibleCount) {
return; // Sortir de la boucle
}
// Ajouter le bouton dynamiquement après chaque `.view-rows-wrapper`
let button = $("<button>")
.addClass("voir-plus")
.text("Voir plus de " + typeName)
.insertAfter(container);
// Cacher tous les éléments sauf ceux définis par `visibleCount`
items.hide().slice(0, visibleCount).show();
// Action sur le bouton
button.on("click", function () {
let hiddenItems = container.find(".views-row:hidden").slice(0, 4); // Prochains éléments à afficher
if ($(this).text().includes("Voir plus")) {
hiddenItems.slideDown(); // Afficher avec un effet de glissement
if (container.find(".views-row:hidden").length === 0) {
$(this).text("Voir moins de " + typeName); // Changer le texte du bouton si tout est affiché
}
} else {
container.find(".views-row").slice(visibleCount).slideUp(); // Replier les éléments
$(this).text("Voir plus de " + typeName); // Revenir à l'état initial
}
});
});
// slimselect
let ressource_type_select = new SlimSelect({
select: '#edit-field-type-de-ressource-target-id--2',
settings:{
placeholderText: 'choisir',
searchPlaceholder: 'choisir'
}
})
let ressource_motscles_select = new SlimSelect({
select: '#edit-field-mots-clefs-target-id--2',
settings:{
placeholderText: 'choisir',
searchPlaceholder: 'choisir'
}
})
let ressource_sites_select = new SlimSelect({
select: '#edit-field-site-target-id-verf--2',
settings:{
placeholderText: 'choisir',
searchPlaceholder: 'choisir'
}
})
// console.log(('sites_select'), sites_select);
}
/////////////////// end voir plus... ressources ////////////////////
///////////////////////// start ressource img clicable mission photo //////////////////////
$('.view-rows-wrapper.type-Mission-photo .views-row').each(function () {
var $row = $(this);
// Lien cible : d'abord le titre, sinon "Voir la gallerie photo"
var $link = $row.find('.views-field-views-conditional-field-1 a, .views-field-views-conditional-field a').first();
// L'image
var $img = $row.find('.views-field-field-images img').first();
if ($link.length && $img.length && !$img.data('missionPhotoBound')) {
console.log('→ Bind click sur image pour', $link.attr('href'));
$img.css('cursor', 'pointer');
$img.on('click', function () {
window.location.href = $link.attr('href');
});
// éviter de binder plusieurs fois (si AJAX / re-init)
$img.data('missionPhotoBound', true);
}
});
///////////////////////// end ressource img clicable mission photo //////////////////////
});
})(jQuery, window);

View File

@@ -0,0 +1,93 @@
(function($, window) {
// //////////////////// start Timeline script ///////////////////////
// Update month field to only show the first 3 letters
document.querySelectorAll('.paragraph--type--phase-deroulement').forEach(function(paragraph) {
const monthField = paragraph.querySelector('.field_field_date_de_moi div:nth-of-type(2)');
if (monthField) {
const monthText = monthField.textContent.trim();
if (monthText === "juillet") {
monthField.textContent = monthText.slice(0, 4);
monthField.classList.add('after');
} else if (monthText === "juin") {
monthField.textContent = monthText.slice(0, 4);
} else if (monthText.length > 3) {
monthField.textContent = monthText.slice(0, 3);
monthField.classList.add('after');
}
}
});
// Fonction pour ajouter ou retirer la classe .only
function updateDateClasses() {
document.querySelectorAll('.paragraph--type--phase-deroulement .date').forEach(function(dateElement) {
const date2Element = dateElement.querySelector('.date2');
const yearElement = dateElement.querySelector('.field_field_date_de_annee');
if (date2Element && !date2Element.textContent.trim()) {
if (yearElement) {
yearElement.classList.add('only');
}
} else {
if (yearElement) {
yearElement.classList.remove('only');
}
}
});
}
// Exécuter la fonction une première fois pour le contenu déjà présent
updateDateClasses();
// MutationObserver pour surveiller les changements dans le DOM
const observer = new MutationObserver(function(mutationsList, observer) {
for(let mutation of mutationsList) {
if (mutation.type === 'childList') {
updateDateClasses();
}
}
});
$(document).ready(function(){
// ////////////////////// start calendrier home /////////////////////////////////
// // Aller au 9e élément à l'initialisation
// $('.__timeline-content').on('init', function(event, slick){
// slick.slickGoTo(11); // Index 8 = 9e item
// });
$('.__timeline-content').slick({
slidesToShow: 3,
slidesToScroll: 1,
dots: false,
arrows: true,
centerMode: false,
draggable: true,
infinite: false,
initialSlide: 13,
responsive: [
{
breakpoint: 810,
settings: {
slidesToShow: 1,
adaptiveHeight: false,
arrows: true,
draggable: true,
centerMode: false,
infinite: false,
initialSlide: 13,
}
}]
});
console.log('salut slick calendrier');
});
//////////////////////// end calendrier home /////////////////////////////////
//////////////////////// end Timeline script /////////////////////////////////////////////
})(jQuery, window);

View File

@@ -64,13 +64,13 @@
}
.field_body{ ///// texte de présentation
// width: 80%;
width: 65%;
width: 60%;
margin: auto;
display: flex;
flex-direction: row;
flex-wrap: wrap ;
position: relative;
margin-left: 14rem;
margin-left: 15rem;
@media(max-width: 1090px){
flex-direction: column;
width: 90%;
@@ -130,6 +130,8 @@
text-transform: uppercase;
font-size: 0.5rem;
padding-left: 0.5rem;
padding-top: 0.1rem;
padding-bottom: 0.1rem;
svg{
display: none;
}
@@ -305,6 +307,7 @@
}
.enjeux{
display: none !important;
display: flex;
flex-direction: row;
flex-wrap: wrap;

View File

@@ -2,6 +2,9 @@ main{
background-color: #f6f7f3;
}
#lesprojets{
#header_right_container{
visibility: hidden !important;
}
.content_container{
// background-color: red;
display: flex;
@@ -56,6 +59,9 @@ main{
margin-bottom: 2rem;
font-size: 0.4rem;
position: relative;
@media(max-width: 810px){
font-size: 1rem;
}
transition: transform 0.4s ease-in-out;
&:hover {
transform: scale(1.05);
@@ -166,13 +172,13 @@ main{
transition: transform 0.4s ease-in-out; // animation plus fluide
&:hover {
transform: scale(1.05); /* effet de zoom léger */
}
}
position: relative;
&:has(.laureat:not(:empty)){
&.is-laureat{
z-index: 0;
}
&:has(.laureat:not(:empty))::before {
&.is-laureat::before {
content: "";
position: absolute;
// display: block;
@@ -217,6 +223,9 @@ main{
margin-bottom: 0.3rem;
margin-top: 0.3rem;
font-family: "gilroy-bold";
@media(max-width: 810px){
font-size: 1rem;
}
}
.field_field_nom_de_l_equipe{
order: 4;
@@ -224,6 +233,9 @@ main{
font-size: 0.5rem;
margin: 0;
text-transform: uppercase;
@media(max-width: 810px){
font-size: 0.8rem;
}
}
}
.field_field_intro{

View File

@@ -44,9 +44,9 @@
display: none;
}
@media(max-width: 810px){
width: 50% !important;
// width: 50% !important;
margin: auto;
margin-top: 3rem;
}
}
.field_field_site_projet{
@@ -54,10 +54,20 @@
width: 65%;
margin: auto;
padding-left: 2rem;
@media(max-width: 810px){
padding-left: 0rem;
width: 80%;
margin-bottom: 1rem;
}
.field_title{
h2{
text-transform: none;
font-size: 0.60rem;
@media(max-width: 810px){
font-size:1rem;
margin: 0;
margin-bottom: 0.5rem;
}
a{
color: $blue_QDD;
font-weight: 700;
@@ -67,6 +77,11 @@
.field_field_sous_titre{
p{
font-size: 0.55rem;
@media(max-width: 810px){
font-size:0.8rem ;
margin: 0;
margin-bottom: 0.5rem;
}
}
}
.more-link{
@@ -76,6 +91,7 @@
background: black;
@media (max-width:810px) {
margin-left: 0;
}
a{
display: inline-flex;
@@ -85,6 +101,9 @@
text-transform: uppercase;
font-size: 0.5rem;
padding-left: 0.5rem;
@media(max-width: 810px){
font-size:0.7rem;
}
svg{
display: none;
@@ -123,12 +142,11 @@
flex-direction: column;
padding-left: 2rem;
@media(max-width: 810px){
// margin-left: 2rem;
// margin-top: 3rem;
padding-left: 0rem;
}
.field_field_laureats{
&:has(.laureat:not(:empty))::before {
&.is-laureat::before {
content: "";
position: absolute;
// display: block;
@@ -141,6 +159,10 @@
background-position: center;
background-size: contain;
z-index: 0;
@media(max-width: 810px){
left: -1.5rem;
top:0.5rem;
}
}
@@ -148,10 +170,18 @@
font-size: 0;
}
}
.field_title{
@media(max-width: 810px){
font-size: 1.3rem;
}
}
.field_field_nom_de_l_equipe{
border-top: solid black 1px;
padding-bottom: 0.5rem;
text-transform: uppercase;
@media(max-width: 810px){
font-size: 1.3rem;
}
}
.field_field_infos{
column-count: 3;
@@ -164,10 +194,16 @@
margin: 0;
font-size: 0.7em;
font-family: 'gilroy-light';
@media(max-width: 810px){
font-size:0.8rem;
}
}
.field_field_contenu{
font-size: 0.8em;
font-family: 'gilroy-bold';
@media(max-width: 810px){
font-size:0.8rem;
}
}
}
}
@@ -183,9 +219,15 @@
margin-left: 0;
font-size: 0.5rem;
font-family: "gilroy-light";
@media(max-width: 810px){
font-size:0.8rem;
}
p{
margin-top: 0;
font-size: 0.5rem;
@media(max-width: 810px){
font-size:0.8rem;
}
}
}
}
@@ -193,22 +235,25 @@
p{
font-family: "gilroy-light";
font-size: 0.6rem;
@media(max-width: 810px){
font-size:0.8rem;
}
}
}
.field_field_equipe_photo,
.field_field_equipe_presentation {
.equipe-panel {
overflow: hidden;
max-height: 0;
opacity: 0;
margin-top: 1rem;
transition:
max-height 1s ease,
opacity 0.8s ease;
}
.field_field_equipe_photo.is-open,
.field_field_equipe_presentation.is-open {
max-height: 1000px;
.equipe-panel.is-open {
// max-height: 1500px;
opacity: 1;
}
.btn-equipe-toggle{
@@ -222,19 +267,27 @@
margin: auto;
display: flex;
border: none;
// margin-top: 1rem;
@media(max-width: 810px){
font-size:0.8rem;
}
svg{
display: none;
}
&::after{
display: inline-flex;
content: url("../img/noun-arrow-to-right.svg");
content: url("../img/arrow-down-white.svg");
padding-right: 0.2rem;
padding-left: 0.2rem;
// padding-bottom: 0.2rem;
height: 25px;
height: 12px;
}
margin-bottom: 1rem;
}
.btn-equipe-toggle[aria-expanded="true"]::after {
content: url("../img/arrow-up-white.svg");
}
.equipe-separator {
border-bottom: 1px solid black;
@@ -257,6 +310,9 @@
p{
font-family: "gilroy-light";
font-size: 0.6rem;
@media(max-width: 810px){
font-size:0.8rem;
}
}
}
}
@@ -279,6 +335,10 @@
object-fit: cover;
width: 220px;
height: 145px;
@media (max-width:810px){
width: 100%;
height: auto;
}
}
}
.image-field-caption{
@@ -288,6 +348,9 @@
margin-top: 0;
font-size: 0.5rem;
font-family: 'gilroy-light';
@media(max-width: 810px){
font-size:0.8rem;
}
}
}
@@ -311,6 +374,9 @@
color: white;
text-transform: uppercase;
font-size: 0.5rem;
@media(max-width: 810px){
font-size:0.8rem;
}
svg{
display: none;
}
@@ -358,98 +424,125 @@
flex: 0 1 24%;
.block-region-third{
position:relative;
// width: 23% !important;
margin-top: 4.5rem;
margin-left: 2rem;
@media(max-width: 810px){
position: relative;
margin-left: 0;
margin-top: 2rem;
}
div{
display: flex;
flex-direction: column;
@media(max-width: 810px){
justify-content: center;
margin: auto;
margin-bottom: 1rem;
width: fit-content;
}
@media(max-width: 500px){
justify-content: center;
margin: auto;
margin-bottom: 1rem;
width: fit-content;
margin-bottom: 0rem;
}
h2{
font-family: "gilroy-light";
text-transform: uppercase;
font-size: 0.6rem;
@media(max-width: 810px){
font-size:0.8rem;
margin: auto;
margin-bottom: 1rem;
width: 80%;
}
&::after{
content: " :";
}
}
.views-row{
width: 80%;
border-bottom: solid black 1px;
padding-bottom: 0.5rem;
padding-top: 0.5rem;
transition: transform 0.4s ease-in-out; // animation plus fluide
&:hover {
transform: scale(1.05); /* effet de zoom léger */
}
.views-field-title {
h2 {
font-size: 0.5rem;
margin-bottom: 0rem;
// margin-top: 0.3rem;
text-transform: none;
font-family: "gilroy-regular";
&::after{
.view-rows-wrapper{
@media(max-width: 810px){
width: 80%;
margin: auto;
}
.views-row{
width: 80%;
border-bottom: solid black 1px;
padding-bottom: 0.5rem;
padding-top: 0.5rem;
@media(max-width: 810px){
width: 80%;
justify-content: start;
padding-top: 1rem;
}
transition: transform 0.4s ease-in-out;
&:hover {
transform: scale(1.05);
}
.is-laureat{
position: relative;
padding-top: 1.5rem;
::before {
content: "";
position: absolute;
top: 0.5rem;
left: -1.4rem;
width: 2.5rem;
height: 2.5rem;
background-image: url("../img/laureat-ouvert.svg");
background-repeat: no-repeat;
background-position: center;
background-size: contain;
z-index: 0;
margin-top: 0.2rem;
@media(max-width: 810px){
top: 0rem;
// left: -11.4rem;
}
}
.field-content{
font-size: 0;
}
}
}
.views-field-field-nom-de-l-equipe{
h3 {
margin-bottom: 0.3rem;
margin-top:0.3rem;
text-transform: uppercase;
.views-field-title {
@media (max-width:810px){
width: fit-content;
margin: 0;
}
h2 {
font-size: 0.5rem;
margin-bottom: 0rem;
text-transform: none;
font-family: "gilroy-regular";
&::after{
content: "";
}
@media(max-width: 810px){
font-size:0.8rem;
width: 100% !important;
}
}
}
font-size: 0.4rem;
p{
font-family: "gilroy-semibold";
margin-bottom: 0.5rem;
.views-field-field-nom-de-l-equipe{
@media (max-width:810px){
width: fit-content;
margin: 0;
}
h3 {
margin-bottom: 0.3rem;
margin-top:0.3rem;
text-transform: uppercase;
}
font-size: 0.4rem;
@media(max-width: 810px){
font-size:0.7rem;
}
p{
font-family: "gilroy-semibold";
margin-bottom: 0.5rem;
}
}
.views-field-view-node{
display: none;
}
}
.views-field-view-node{
display: none;
// width: fit-content;
// padding-left: 0.5rem;
// background: black;
// @media (max-width:810px) {
// margin-left: 0;
// }
// a{
// display: inline-flex;
// justify-content: space-between;
// align-items: center;
// color: white;
// text-transform: uppercase;
// font-size: 0.5rem;
// svg{
// display: none;
// }
// &::after{
// display: inline-flex;
// content: url("../img/noun-arrow-to-right.svg");
// padding-right: 0.2rem;
// padding-left: 0.2rem;
// // padding-bottom: 0.2rem;
// height: 25px;
// }
// }
}
}
.field_field_laureats{
color: red;

View File

@@ -13,8 +13,12 @@
display: flex;
flex-direction: column;
width: 100%;
}
.layout__region--first{
@media(max-width: 810px){
order:2
}
.block-region-first{
#sites-map-container{
width: 100% !important;
@@ -27,38 +31,12 @@
&::after{
content: " :";
}
}
} .field_field_link{
div{
display: flex;
justify-content: center;
}
a{
display: inline-flex;
justify-content: space-between;
align-items: center;
color: white;
text-transform: uppercase;
font-size: 0.5rem;
padding-right: 0.5rem;
background-color: black;
padding-bottom: 0.1rem;
padding-top: 0.1rem;
padding-left: 0.2rem;
// svg{
// display: none;
// }
&::before{
display: inline-flex;
content: url("../img/noun-arrow-to-left.svg");
padding-right: 0.2rem;
padding-left: 0.2rem;
// padding-bottom: 0.2rem;
height: 12px;
@media(max-width: 810px){
font-size: 1rem;
}
}
}
}
}
.field_field_link{
div{
display: flex;
@@ -73,9 +51,12 @@
font-size: 0.5rem;
padding-right: 0.5rem;
background-color: black;
padding-bottom: 0.1rem;
padding-top: 0.1rem;
padding-bottom: 0.2rem;
padding-top: 0.2rem;
padding-left: 0.2rem;
@media(max-width: 810px){
font-size: 1rem;
}
// svg{
// display: none;
@@ -100,15 +81,21 @@
margin-top: 3rem;
margin-right: 2rem;
// width: 60%;
@media(max-width: 810px){
order:1;
margin-top: 3rem;
margin-right: 0;
}
.block-region-second{
display: flex;
flex-direction: column;
flex-wrap: wrap;
margin-left: 2rem;
margin-right: 3rem;
@media(max-width: 500px){
margin-left: 0.5rem;
margin-top: 1rem;
@media(max-width: 810px){
margin-left: 00rem;
margin-top: 0rem;
margin-right: 0rem;
}
.field_title,
.field_field_sous_titre{
@@ -206,9 +193,10 @@
background: black;
padding-left: 0.5rem;
text-transform: uppercase;
font-size: 0.6rem;
font-size: 0.5rem;
margin-bottom: 0.3rem;
padding: 0.3rem;
padding: 0.2rem 0.5rem;
svg{
display: none;
@@ -226,7 +214,7 @@
background: black;
padding-left: 0.5rem;
text-transform: uppercase;
font-size: 0.6rem;
font-size: 0.5rem;
margin-bottom: 0.3rem;
svg{
@@ -237,6 +225,7 @@
content: url("../img/noun-arrow-to-right.svg");
padding-right: 0.2rem;
padding-left: 0.2rem;
height: 25px;
}
a{
color: white;
@@ -246,6 +235,7 @@
div:has(.field_field_images){
order: 10;
width: 100%;
.diaporama{
display: flex !important;
flex-direction: row !important;
@@ -258,10 +248,17 @@
}
.images{
// margin: auto;
@media (max-width:810px){
margin: auto;
}
img{
object-fit: cover;
width: 220px !important;
height: 145px;
@media (max-width:810px){
width: 100% !important;
height: auto;
}
}
}
.image-field-caption{
@@ -271,6 +268,9 @@
margin-top: 0;
font-size: 0.5rem;
font-family: 'gilroy-light';
@media (max-width:810px){
font-size: 1rem;
}
}
}
}

View File

@@ -317,7 +317,7 @@
gap: 20px;
flex-wrap: wrap;
margin-bottom: 2rem;
@media(max-width: 500px){
@media(max-width: 810px){
flex-direction: column !important;
}
.cadre-img-zoom{
@@ -326,6 +326,10 @@
object-fit: cover;
width: 220px;
height: 145px;
@media(max-width: 810px){
width: 100%;
height: auto;
}
}
}
.image-field-caption{
@@ -335,6 +339,9 @@
margin-top: 0;
font-size: 0.5rem;
font-family: 'gilroy-light';
@media(max-width: 810px){
font-size: 0.8rem;
}
}
}
}
@@ -391,24 +398,13 @@
// width: 80%;
@media(max-width: 810px){
position: relative;
margin-left: 1rem;
margin-top: 3rem;
}
div{
display: flex;
flex-direction: column;
// margin-bottom: 1rem;
@media(max-width: 810px){
justify-content: center;
margin: auto;
margin-bottom: 1rem;
width: fit-content;
}
@media(max-width: 500px){
justify-content: center;
margin: auto;
margin-bottom: 1rem;
width: fit-content;
}
div:has(h2){
border-bottom: solid black 1px;
padding-left: 0.3rem;
@@ -423,83 +419,110 @@
border-bottom: solid black 1px;
margin-left: 0.5rem;
padding-bottom: 0.5rem;
@media(max-width: 810px){
font-size:0.8rem;
margin: 0;
margin-bottom: 1rem;
}
&::after{
content: " :";
}
}
.node-type-projet {
position: relative;
transition: transform 0.4s ease-in-out; // animation plus fluide
&:hover {
transform: scale(1.05); /* effet de zoom léger */
}
&:has(.laureat:not(:empty)){
padding-top: 1.5rem;
}
&:has(.laureat:not(:empty))::before {
content: "";
position: absolute;
// display: block;
top: -0.1rem; // adapte la position selon ton visuel
left: -1rem;
width: 2.5rem;
height: 2.5rem;
// background-color: #f6f7f3;
background-image: url("../img/laureat-ouvert.svg");
background-repeat: no-repeat;
background-position: center;
background-size: contain;
z-index: 0;
margin-top: 0.3rem;
}
.node-projet-title{
.field_field_projets_lie{
@media(max-width: 810px){
width: 80%;
padding-left: 0.5rem;
font-size: 0.5rem;
margin: 0;
background-color: #f6f7f3;
font-family: "gilroy-regular";
justify-content: start;
// padding-top: 1rem;
}
.field_field_nom_de_l_equipe{
width: 80%;
padding-left: 0.5rem;
font-size: 0.4rem;
background-color: #f6f7f3;
text-transform: uppercase;
div{
border-bottom: solid black 1px;
margin-bottom: 0.5rem;
.node-type-projet {
position: relative;
transition: transform 0.4s ease-in-out;
&.is-laureat{
padding-top: 1.2rem;
}
p{
font-family: "gilroy-semibold";
margin-bottom: 0.5rem;
&:hover {
transform: scale(1.05);
}
.node-projet-title{
width: 80%;
padding-left: 0.5rem;
font-size: 0.5rem;
margin-top: 0.2rem;
}
div.more-link{
display: none;
margin-bottom: 1rem;
padding-left: 0rem;
a{
font-size: 0.5rem;
margin: 0;
background-color: #f6f7f3;
font-family: "gilroy-regular";
@media(max-width: 810px){
font-size:0.8rem;
width: 100% !important;
}
}
}
.field_field_laureats{
color:$red_QDD;
text-transform: uppercase;
display: inline-flex;
align-items: flex-start;
height: auto;
font-size: 0px;
}
}
.field_field_nom_de_l_equipe{
width: 80%;
padding-left: 0.5rem;
font-size: 0.4rem;
background-color: #f6f7f3;
text-transform: uppercase;
@media(max-width: 810px){
font-size:0.8rem;
width: 100% !important;
}
div{
border-bottom: solid black 1px;
margin-bottom: 0.5rem;
}
p{
font-family: "gilroy-semibold";
margin-bottom: 0.5rem;
font-size: 0.5rem;
margin-top: 0.2rem;
@media(max-width: 810px){
font-size:0.8rem;
width: 100% !important;
}
}
div.more-link{
display: none;
margin-bottom: 1rem;
padding-left: 0rem;
a{
font-size: 0.5rem;
}
}
}
.field_field_laureats{
color:$red_QDD;
text-transform: uppercase;
display: inline-flex;
align-items: flex-start;
height: auto;
font-size: 0px;
&.is-laureat{
position: relative;
}
&.is-laureat::before {
content: "";
position: absolute;
top: -4.2rem;
left: -1rem;
width: 2.5rem;
height: 2.5rem;
background-image: url("../img/laureat-ouvert.svg");
background-repeat: no-repeat;
background-position: center;
background-size: contain;
z-index: 0;
margin-top: 0.3rem;
@media(max-width: 810px){
top: -6rem;
}
}
}
}
}
}
.prevnext{
display: none;

View File

@@ -199,7 +199,16 @@
@media(max-width: 810px){
width: 50%;
}
.views-field-field-documents a{
h2{margin-bottom: 0.2rem;}
.views-field-field-date-ressource{
padding-top: 0.3rem;
}
.views-field-body-1 p{
margin-top: 0.2rem;
margin-bottom: 0.2rem;
}
.views-field-field-documents a,
.views-field-field-liens a{
display: inline-flex;
align-items: center;
@@ -311,7 +320,7 @@
width: 100%;
background-color: $blue_QDD;
}
&.type-Galerie-photos{
&.type-Mission-photo{
justify-content: space-between;
.views-row{
width: 18%;

View File

@@ -22,6 +22,7 @@
}
}
.content-actus{
width: 100%;
.slick-list{
padding-bottom: 1rem;
@media(max-width: 810px){
@@ -31,7 +32,7 @@
.view-rows-wrapper{
margin-left: 25%;
width: 65%;
width: 55%;
display: flex;
flex-direction: column;
flex-wrap: wrap;
@@ -54,6 +55,7 @@
.node-type-actualite{
width: 85%;
// padding-bottom: 2rem;
cursor: pointer;
.content-wrapper-actu{
display: grid;
@@ -250,21 +252,32 @@
display: inline-flex;
align-items: center;
a{
width: 5em;
display: block;
display: inline-flex;
overflow: hidden;
white-space: nowrap;
font-size: 0px;
align-items: baseline;
&::before{
content: "En savoir";
display: block;
// width: 20px;
padding-left: 0.4rem;
font-size: 0.7rem;
height: fit-content;
}
&::after{
content: " +";
display: flex;
padding-left: 0.3rem;
font-size: 1rem;
height: 26px;
margin: auto;
align-items: center;
}
}
&::after{
content: "+";
display: block;
// width: 20px;
padding-left: 0.4rem;
font-size: 1.8rem;
height: fit-content;
}
}
.field_field_liens{
order: 7;
@@ -281,7 +294,8 @@
text-transform: uppercase;
font-size: 0.5rem;
margin-bottom: 0.5rem;
padding-top: 0.1rem;
padding-bottom: 0.1rem;
svg{
display: none;
}
@@ -330,8 +344,8 @@
display: flex;
flex-direction: row;
padding-left: 0.5rem;
// padding-top: 0.2rem;
// padding-bottom: 0.2rem;
padding-top: 0.1rem;
padding-bottom: 0.1rem;
display: inline-flex;
align-items: center;
color: white;

View File

@@ -3,39 +3,42 @@ header{
.field_field_logo{
.qdd-header{
opacity: 0;
animation-delay: 0.9s;
animation-name: scale;
animation-duration: 2.8s;
&.animated{
opacity: 1;
transform: scale(2);
transform: scale(2);
@media(max-width:820px) {
transform: scale(1);
}
.blink-blue {
opacity: 0;
// animation: blink 3s 3;
animation-delay: 0.2s;
animation-delay: 0.1s;
animation-name: blink;
animation-duration: 10s;
animation-duration: 5s;
}
.blink-red {
opacity: 0;
animation-delay: 0.8s;
animation-delay: 0.3s;
animation-name: blink;
animation-duration: 10s;
animation-duration: 5s;
}
.blink-black {
opacity: 0;
animation-delay: 1.5s;
animation-delay: 0.5s;
animation-name: blink;
animation-duration: 10s;
animation-duration: 5s;
}
.blink-black2 {
opacity: 0;
animation-delay: 2s;
animation-delay: 0.7s;
animation-name: blink;
animation-duration: 10s;
animation-duration: 5s;
}
@keyframes blink {
0%, 100% {
@@ -49,8 +52,8 @@ header{
.consultation{
display: none;
animation-name: slideIn;
animation-delay: 1s;
animation-duration: 3s;
animation-delay: 0.5s;
animation-duration: 1s;
}
@keyframes slideIn {
@@ -62,15 +65,14 @@ header{
}
}
// @keyframes scale {
// 0%{
// transform: scale(2);
// }
// 90%{transform: scale(2);}
// 100% {
// transform: scale(1);
// }
// }
@keyframes scale {
0%{
transform: scale(2);
}
100% {
transform: scale(1);
}
}
}
@@ -78,4 +80,6 @@ header{
}
}
}
}

View File

@@ -7,11 +7,13 @@ header[role="banner"]{
max-width: 100vw;
position: fixed;
top: 0;
transition: none;
// transition: none;
// transition: height 0.5s ease-in-out, width 0.5s ease-in-out;
// transition: height 2s ease-in-out, width 2s ease-in-out; /* Transition pour le changement de taille */
// transition: height 0.3s, padding 0.3s; /* Add transition for smooth resizing */
// transition: height 1s, padding 1s; /* Add transition for smooth resizing */
transition: height 1.4s ease-in-out,
width 1.4s ease-in-out;
.language-switcher-language-url{
text-transform: uppercase;
color: white;
@@ -68,8 +70,13 @@ header[role="banner"]{
flex: 0 0 100%;
display: flex;
flex-direction: row;
transition: height 2s ease-in-out, width 2s ease-in-out; /* Transition pour le changement de taille */
// transition: height 2s ease-in-out, width 2s ease-in-out; /* Transition pour le changement de taille */
background-color: $white-header;
// 🔥 On anime la largeur via flex-basis (et width au cas où)
transition:
flex-basis 0.9s ease-in-out,
width 0.9s ease-in-out;
img{display: none;}
@media(max-width: 660px){
height: inherit;
@@ -120,7 +127,7 @@ header[role="banner"]{
}
}
.header_right_container{
// display: none;
display: none;
flex: 0 0 0%;
width: fit-content;
min-width: fit-content;
@@ -187,7 +194,11 @@ header[role="banner"]{
background: $blue_QDD;
text-align: center;
transform: translateX(0);
transition: transform 0.3s ease-in-out;
// transition: transform 0.3s ease-in-out;
transition:
flex-basis 0.9s ease-in-out,
width 0.9s ease-in-out,
transform 0.3s ease-in-out; // pour tes slides
z-index: -1 ;
display: flex;
flex-direction: column;
@@ -307,12 +318,16 @@ header[role="banner"]{
height: 170px;
}
}
/* Taille définitive du header après l'animation */
header[role="banner"].header--collapsed {
height: $header-height; /* Ou la hauteur que vous souhaitez pour votre header */
width: 35%;
transform-origin: bottom right;
transition: all 1s ease-in-out;
// transition: all 1s ease-in-out;
// transition: all 1.4s ease-in-out;
transition: all 1.4s ease-in-out;
@media(max-width: 1090px) {
height: $header-height-pad;
}
@@ -327,14 +342,17 @@ header[role="banner"].header--collapsed {
height: 170px;
}
.header_left_container{
flex: 1 0 65%;
// flex: 1 0 65%;
flex-basis: 65%;
transform-origin: bottom right;
@media(max-width: 810px){
flex: 1 0 100%;
}
}
.header_nav_container{
flex: 0 0 30%;
// flex: 0 0 30%;
flex-basis: 30%;
transform-origin: bottom right;
min-width: fit-content;
@media(max-width: 810px){
@@ -363,14 +381,16 @@ header[role="banner"].header--collapsed-already{
height: $header-height-big;
}
.header_left_container{
flex: 1 0 65%;
// flex: 1 0 65%;
flex-basis: 65%;
transform-origin: bottom right;
@media(max-width: 810px){
flex: 1 0 100%;
}
}
.header_nav_container{
flex: 0 0 30%;
// flex: 0 0 30%;
flex-basis: 30%;
min-width: fit-content;
transform-origin: bottom right;
@media(max-width: 810px){
@@ -385,3 +405,51 @@ header[role="banner"].header--collapsed-already{
}
}
/* Empêcher le scroll pendant l'intro */
body.logo-intro-animating {
overflow: hidden;
}
/* Header plein écran au tout début */
body.logo-intro-active header[role="banner"] {
height: 100vh;
width: 100%;
}
/* État normal du SVG (dans le header) */
#block-quartiers-de-demain-logoquartiersdedemain svg {
position: relative;
top: auto;
left: auto;
transform: none; // donc scale(1)
transform-origin: center center;
transition:
transform 1.4s ease-in-out,
top 1.4s ease-in-out,
left 1.4s ease-in-out;
}
/* État intro : logo centré, scale(2) */
body.logo-intro-active #block-quartiers-de-demain-logoquartiersdedemain svg {
position: fixed;
top: 50%;
left: 50%;
transform: translate(-50%, -50%) scale(2);
z-index: 9999;
}
/* Pendant l'intro : même si le header est "collapsed",
on garde TOUT l'espace pour le bloc gauche,
la nav ne prend AUCUNE place (0%) */
body.logo-intro-animating header[role="banner"].header--collapsed .header_left_container {
flex: 0 0 100%;
}
body.logo-intro-animating header[role="banner"].header--collapsed .header_nav_container {
flex: 0 0 0%;
width: 0;
overflow: hidden;
}

View File

@@ -212,6 +212,8 @@
text-transform: uppercase;
font-size: 0.6rem;
margin: auto;
padding-top: 0.1rem;
padding-bottom: 0.1rem;
@media (max-width:810px) {
margin-left: 0;
margin: auto;

View File

@@ -15,6 +15,7 @@
@import "global/layout";
@import "global/reset";
@import "global/mediaquerries";
// @import "global/_animated-logo";
@@ -24,12 +25,12 @@
@import "partials/header";
@import "partials/footer";
@import "partials/aside";
@import "partials/animation-logo";
// @import "partials/animation-logo";
@import "partials/slick-theme";
@import "partials/slick";
@import "partials/timeline";
@import "partials/actu-caroussel-home";
@import "partials/animation-logo-header";
// @import "partials/animation-logo-header";
@import "partials/formes-animees";
@import "partials/animation-pilliers";
@import "partials/map";

View File

@@ -50,6 +50,15 @@
{%
set ancre_href = '#paragraph-id--' ~ paragraph.id()
%}
{# Vrai si au moins un item a du contenu (donc booléen "vrai") #}
{% set is_laureat = false %}
{% for item in items %}
{% if item.content|render|trim is not empty %}
{% set is_laureat = true %}
{% endif %}
{% endfor %}
{% if label_hidden %}
{% if multiple %}
<div{{ attributes }}>
@@ -63,17 +72,16 @@
{% endfor %}
{% endif %}
{% else %}
<div{{ attributes }}>
<div{{ attributes.addClass(is_laureat ? 'is-laureat') }}>
<div{{ title_attributes.addClass(title_classes) }}>{{ label }}</div>
{% if multiple %}
<div>
{% endif %}
{% for item in items %}
{# {% for item in items %}
<div class="laureat"{{ item.attributes }}>{{ item.content }}</div>
{% endfor %}
{% endfor %} #}
{% if multiple %}
</div>
{% endif %}
</div>
{% endif %}
{% endif %}

View File

@@ -62,7 +62,10 @@
* @ingroup themeable
*/
#}
<article{{ attributes }}>
{# On calcule une variable Twig pour savoir si le node est lauréat #}
{% set is_laureat = node.field_laureats.value ?? 0 %}
<article{{ attributes.addClass(is_laureat ? 'is-laureat' : '') }}>
{{ title_prefix }}
{% if label and not page %}

View File

@@ -62,7 +62,11 @@
* @ingroup themeable
*/
#}
<article{{ attributes }}>
{# Le node est lauréat si field_laureats vaut "1" #}
{% set is_laureat = node.field_laureats is defined and node.field_laureats.value == '1' %}
<article{{ attributes.addClass(is_laureat ? 'is-laureat') }}>
{{ title_prefix }}
{% if label and not page %}
@@ -89,14 +93,35 @@
{% set node_title = node.label %}
{% set node_url = (url is defined and url) ? url : path('entity.node.canonical', {'node': node.id}) %}
{% if node_title %}
{# {% if node_title %}
{{ title_prefix }}
<h3{{ title_attributes }} class="node-projet-title">
<a href="{{ node_url }}" rel="bookmark">{{ node_title }}</a>
</h3>
{{ title_suffix }}
{% endif %}
{{ content }}
{{ content }} #}
{% if node_title %}
{{ title_prefix }}
<a href="{{ node_url }}" rel="bookmark" class="node-projet-link">
<h3{{ title_attributes.addClass('node-projet-title') }}>
{{ node_title }}
</h3>
{# Champ "Nom de l'équipe" inclus dans le lien #}
{% if content.field_nom_de_l_equipe is defined %}
{{ content.field_nom_de_l_equipe }}
{% endif %}
</a>
{{ title_suffix }}
{# On affiche le reste des champs, sans field_nom_de_l_equipe #}
{{ content|without('field_nom_de_l_equipe') }}
{% else %}
{{ content }}
{% endif %}
</div>

View File

@@ -31,7 +31,7 @@
* @ingroup themeable
*/
#}
{#
{% for field in fields -%}
@@ -54,5 +54,45 @@
{%- if field.wrapper_element -%}
</{{ field.wrapper_element }}>
{%- endif %}
{%- endfor %}
{%- endfor %} #}
{# Vrai si le champ field_laureats a une valeur brute #}
{# On récupère la valeur brute du champ field_laureats sur l'entité #}
{% set laureat_value = row._entity.field_laureats.value ?? null %}
{% set laureat_value = row._entity.field_laureats.value ?? null %}
{% for id, field in fields -%}
{{ field.separator }}
{%- if field.wrapper_element -%}
{# On part des attributs existants du wrapper #}
{% set wrapper_attributes = field.wrapper_attributes %}
{# Si c'est le champ field_laureats ET qu'il a une valeur, on ajoute la classe #}
{% if id == 'field_laureats' and laureat_value %}
{% set wrapper_attributes = wrapper_attributes.addClass('is-laureat') %}
{% endif %}
<{{ field.wrapper_element }}{{ wrapper_attributes }}>
{%- endif %}
{%- if field.label -%}
{%- if field.label_element -%}
<{{ field.label_element }}{{ field.label_attributes }}>{{ field.label }}{{ field.label_suffix }}</{{ field.label_element }}>
{%- else -%}
{{ field.label }}{{ field.label_suffix }}
{%- endif %}
{%- endif %}
{%- if field.element_type -%}
<{{ field.element_type }}{{ field.element_attributes }}>
{{ field.content }}
</{{ field.element_type }}>
{%- endif %}
{%- if field.wrapper_element -%}
</{{ field.wrapper_element }}>
{%- endif %}
{%- endfor %}

View File

@@ -9,6 +9,10 @@ let config = {
// "./src/assets/js/animated_logo.js",
"./src/assets/js/animated_formes.js",
"./src/assets/js/lightbox.js",
"./src/assets/js/header.js",
"./src/assets/js/timeline.js",
"./src/assets/js/ressources.js",
"./src/assets/scss/quartiers_de_demain.scss",
// "./src/assets/fonts/*",
// "./src/assets/css/animated_logo.css",
@@ -66,11 +70,18 @@ let config = {
],
}
},
externals: {
drupal: 'Drupal',
Drupal: 'Drupal',
},
}
module.exports = config;
module.exports = config;