body {
font-family: “Atlas Grotesk Regular”, sans-serif;
overflow-x: hidden;
}
/* removes top padding from page */
#story #features {
padding-top: 0px;
}
.explosion-marker {
width: 36px;
height: 36px;
background-color: #e5393536;
border: 3px dashed #D50000;
border-radius: 50%;
box-sizing: border-box;
}
.explosion-marker.seen {
background-color: #E539356b;
border: 3px solid #D50000;
}
/* ———- TITLE STEP START */
#piece-title-video {
opacity: 1.0;
padding-bottom: 0px;
padding-top: 0px;
width: 100%;
margin: 0px;
}
#piece-title-video .dark,
#piece-title-video .light {
padding: 0px;
}
#piece-title-video .dark p,
#piece-title-video .light p {
margin: 0px;
padding: 0px;
}
#piece-title-video .video-container {
position: relative;
/* width: 100%; */
height: 100%;
padding: 0px;
background: #e3e3e3ba;
}
#scroll-overlay {
position: absolute;
/* top: 80%; */
top: 80vh;
left: 50%;
transform: translate(-50%, -80%);
background-color: #D8AE5E;
font-size: 3vh;
line-height: 2rem;
text-align: center;
padding: 5px;
padding-top: 10px;
padding-bottom: 10px;
animation: bounce 1s infinite;
display: none;
}
@keyframes bounce {
0%,
20%,
50%,
80%,
100% {
transform: translate(-50%, -80%);
/* Keep the div’s position */
}
40% {
transform: translate(-50%, -95%);
/* Adjust for bounce */
}
60% {
transform: translate(-50%, -85%);
/* Adjust for bounce */
}
}
#video-piece-title-video {
width: 100%;
height: 100vh;
object-fit: cover;
}
#piece-title-video .title-overlay {
position: absolute;
width: 80%;
line-height: 1.3;
top: 20%;
left: 50%;
transform: translate(-50%, -50%);
/* background-color: rgba(0, 0, 0, 0.2); */
/* color: #212121; */
color: #827717;
/* color: #D8AE5E; */
padding: 20px;
font-size: 24px;
text-align: center;
}
#scripps-iframe {
width: 100%;
height: auto;
min-height: 315px;
}
/* ———- TITLE STEP END */
video {
width: 100%;
}
body {
margin: 0;
padding: 0;
}
#story a,
#story a:hover,
#story a:visited {
color: #0071bc;
}
#map {
top: 0;
height: 100vh;
width: 100vw;
position: fixed;
left: 0;
}
#mapInset {
bottom: 50px;
right: 30px;
height: 180px;
width: 250px;
max-width: 100%;
position: fixed;
z-index: 1;
opacity: 1;
transition: opacity 0.5s ease-in-out;
pointer-events: none;
}
#mapInset .mapboxgl-ctrl-bottom-left {
display: none;
}
@media (max-width: 500px) {
#mapInset {
display: none;
}
}
#header {
margin: auto;
width: 100%;
position: relative;
z-index: 5;
}
#header h1,
#header h2,
#header p {
margin: 0;
padding: 2vh 2vw;
text-align: center;
}
#footer {
width: 100%;
min-height: 5vh;
padding-top: 2vh;
padding-bottom: 2vh;
text-align: center;
line-height: 25px;
font-size: 13px;
position: relative;
z-index: 5;
}
#features {
padding-top: 10vh;
padding-bottom: 10vh;
}
.hidden {
visibility: hidden;
}
.centered {
width: 50vw;
margin: 0 auto;
}
.lefty {
width: 36vw;
margin-left: 5vw;
}
.righty {
width: 36vw;
margin-left: 62vw;
}
.fully {
width: 80%;
margin: auto;
}
.light {
color: #444;
background-color: #fafafa;
}
.dark {
color: #fafafa;
background-color: #444;
}
.step {
padding-top: 50vh;
padding-bottom: 50vh;
/* margin-bottom: 10vh; */
opacity: 0.25;
}
.step.active {
opacity: 0.95;
}
.step div {
line-height: 0px;
font-size: 1.12rem;
padding: 5px;
padding-bottom: 10px;
border-radius: 5px;
}
.step div p {
line-height: 25px;
padding: 15px 25px;
margin: 0px;
}
.step h3 {
max-width: 50vw;
margin-left: auto;
margin-right: auto;
line-height: 1.7rem;
/* text-align: justify; */
padding: 25px 25px;
line-height: 1.6rem;
margin-top: 0px;
margin-bottom: 0px;
font-size: 1rem;
}
.step.fully h3 {
max-width: 600px;
}
.step img {
width: 100%;
margin-bottom: 15px;
}
@media (max-width: 750px) {
.centered,
.lefty,
.righty,
.fully {
width: 90vw;
margin: 0 auto;
}
}
/* Fix issue on mobile browser where scroll breaks */
.mapboxgl-canvas-container.mapboxgl-touch-zoom-rotate.mapboxgl-touch-drag-pan,
.mapboxgl-canvas-container.mapboxgl-touch-zoom-rotate.mapboxgl-touch-drag-pan .mapboxgl-canvas {
touch-action: unset;
}
#video-grid {
display: flex;
flex-wrap: wrap;
position: fixed;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
width: 100%;
height: 100%;
display: none;
}
#video-grid>div {
margin: 10px;
flex: 1 1 19%;
height: 17%;
visibility: hidden;
}
#video-grid video {
width: 100%;
height: 100%;
}
.video-container {
position: relative;
}
.media-overlay {
position: absolute;
/* left: 10px; */
color: white;
font-size: 10px;
bottom: -7px;
/* right: 5px; */
left: 50%;
transform: translate(-50%, 0);
}
.step div p.media-overlay {
padding: 0px;
line-height: 14px;
}
#story .media-overlay a {
color: black;
/* color: #dcdcdc; */
}
#story .media-overlay a:hover {
color: #0071bc;
}
#ar-0-final-banner h3 {
text-align: center;
line-height: 1.7rem;
font-size: 1.17rem;
}
@media (max-width: 680px) {
h1 {
margin-top: 0px;
}
}
#video-piece-title-video {
position: absolute;
left: 0;
min-width: 100%;
height: 100vh;
margin-bottom: 2em;
z-index: 0;
top: 0;
}
.singular__content__aside {
z-index: 1;
}
.singular__content__text__title {
z-index: 1;
position: relative;
}
h1 {
text-align: center;
margin-top: 1em;
font-weight: bold;
text-shadow: 0px 0px 3px white;
}
@media (max-width: 680px) {
h1 {
margin-top: 0px;
}
}
#scrolly {
position: sticky;
top: 0px;
width: 100vw;
left: 0px;
margin-left: calc(-1 * ((100vw – 1160px) / 2));
margin-top: -20em;
}
@media only screen and (max-width: 1190px) {
#scrolly {
margin-left: -15px;
}
}
@media only screen and (max-width: 1023px) {
#scrolly {
margin-left: -15px;
}
}
.step {
min-height: 10px;
}
.site__footer {
z-index: 1;
position: relative;
}
.singular__content__text__content p,
.singular__content__text__content hr {
z-index: 1;
position: relative;
}
.singular__content__text–social {
z-index: 1;
position: relative;
}
.singular__related {
z-index: 1;
position: relative;
}
#video-grid {
height: calc(100% – 60px);
top: calc(50% + 30px);
}
#end-bg {
position: absolute;
background-color: #fff;
z-index: 0;
width: 100vw;
height: 1400px;
margin-left: calc(-1 * ((100vw – 1160px) / 2));
}
@media only screen and (max-width: 1190px) {
#end-bg {
margin-left: -15px;
height: 1400px;
}
}
@media only screen and (max-width: 1023px) {
#end-bg {
margin-left: -15px;
height: 1600px;
}
}
@media only screen and (max-width: 370px) {
#end-bg {
margin-left: -15px;
height: 1800px;
}
}
.footer__mailing {
position: relative;
z-index: 1;
}
.singular__content__aside{width:100%;order:1}
.singular__content__text__meta {
z-index: 1;
position: relative;
display: flex;
justify-content: center;
}
.singular__content__text {
order: 0;
}
.singular__content {
flex-direction: column;
}
.singular__content__text {
width: 100%;
max-width: 100%;
}
#story .media-overlay a {
color: #999999;
font-size: 0.75em;
}
.step p.media-overlay {
text-align: center;
}
const defaultPitch = 3;
const defaultBearing = 40;
var config = {
// style: ‘mapbox://styles/mapbox/navigation-night-v1’,
style: ‘mapbox://styles/bellingcat-mapbox/clvdnnl2100zb01ph06pmezzq’,
accessToken: ‘pk.eyJ1IjoiYmVsbGluZ2NhdC1tYXBib3giLCJhIjoiY2x2YXM3d2ppMDFlbjJxbGhrY2luODA5ZiJ9.TKGosk0RXDGxuFxVl1U8mg’,
// showMarkers: true,
markerColor: ‘#3FB1CE’,
//projection: ‘equirectangular’,
//Read more about available projections here
//https://docs.mapbox.com/mapbox-gl-js/example/projections/
inset: false,
theme: ‘light’,
use3dTerrain: false, //set true for enabling 3D maps.
auto: false,
journey: {
“type”: “FeatureCollection”,
“features”: [
{
“type”: “Feature”,
“geometry”: {
“type”: “LineString”,
“coordinates”: [
[34.413692528828498, 31.5009527843626],
[34.4319322234604, 31.505486463787101],
[34.453744781212698, 31.485096630444598],
[34.468097563246403, 31.496143787904401],
[34.465974891495399, 31.4963781918112],
[34.365589083516902, 31.309957654050599],
[34.363432697556703, 31.3097833973621],
[34.362488595698899, 31.310555393424501],
[34.363496283074099, 31.3086506260078],
[34.362225387225202, 31.306885614161299],
[34.305505192661997, 31.3428129088425]]
}
}
]
},
chapters: [
{
id: ‘piece-title-video’,
alignment: ‘full’,
hidden: false,
showMarker: false,
description: `
`,
location: {
center: [34.75398, 31.44497],
zoom: 7.15,
pitch: defaultPitch,
bearing: 0
},
mapAnimation: ‘flyTo’,
rotateAnimation: false,
callback: ”,
onChapterEnter: [],
onChapterExit: []
},
{
id: ‘israel-focus’,
alignment: ‘full’,
hidden: true,
showMarker: false,
location: {
center: [34.75398, 31.44497],
zoom: 7.15,
pitch: defaultPitch,
bearing: 0
},
mapAnimation: ‘flyTo’,
rotateAnimation: false,
callback: ”,
onChapterEnter: [],
onChapterExit: []
},
{
id: ‘ar-0-text-israel’,
alignment: ‘center’,
hidden: false,
showMarker: false,
description: `
Twenty days after more than 1,100 people were killed in a Hamas attack on October 7, the Israel Defense Forces (IDF) launched its ground offensive in Gaza with the stated aim of destroying Hamas and bringing hostages home. As of April 12, more than 33,000 people have been killed in Gaza according to UN OCHA reports. In response to the IDF offensive the International Court of Justice issued interim measures to prevent genocide.
Systematic and widespread attacks on civilian housing and infrastructure in Gaza has been described as “domicide” by Professor Balakrishnan Rajagopal, the UN’s Special Rapporteur on the right to adequate housing. He told us “Even with attacks against individual buildings, every building which is bombed or destroyed has got to be evaluated legally. Whether a building on this or that corner of a road needed to be destroyed or not…the burden is on the IDF to show that they have evidence, that they have proof and that the attack is proportionate and necessary”. It’s estimated that more than 50% of Gaza’s buildings have been destroyed or damaged and approximately 1.7 million people have been displaced since the offensive began. Bellingcat worked with partners Scripps News to investigate the alleged domicide in Gaza and the ongoing conflicts over land in the West Bank, you can watch the full documentary here.
`,
location: {
center: [34.75398, 31.44497],
zoom: 7.15,
pitch: defaultPitch,
bearing: 0
},
mapAnimation: ‘flyTo’,
rotateAnimation: false,
callback: ”,
onChapterEnter: [],
onChapterExit: []
},
{
id: ‘ar-0’,
alignment: ‘full’,
hidden: true,
showMarker: false,
location: {
center: [34.35901, 31.42290],
zoom: 10.35,
pitch: defaultPitch,
bearing: defaultBearing,
speed: 0.5
},
mapAnimation: ‘flyTo’,
rotateAnimation: false,
callback: ”,
onChapterEnter: [],
onChapterExit: []
},
{
id: ‘ar-0-text-gaza’,
alignment: ‘center’,
hidden: false,
showMarker: false,
description: `
The constant repetition of images of destruction inside Gaza, where entire neighbourhoods have been turned into rubble, can result in desensitisation about the impact of the offensive.
Yet behind each ruined building, each demolished minaret, each pile of rubble, there is a decision and an action which has been carried out by a specific unit or person.
We used social media to track a single IDF combat engineering battalion, 8219 Commando, as they moved across Gaza, demolishing tunnels, houses, and mosques.
8219 Commando is a combat engineering battalion associated with 551 Commando Brigade and – as one of its members asks journalists to report – part of the 98th Division. We noticed that soldiers from 8219 openly posted about their experiences inside Gaza, providing a window into military operations that rarely opens when looking at official sources.
One member of 8219, a captain, wrote posts about his experience in the form of a war diary, noting where they were, and what they destroyed. These posts, combined with social media posts by other members of 8219, include videos, pictures and statements describing the unit’s experience of war. We geolocated each video or image of a demolition, verifying exactly where it took place. We then used satellite imagery from Planet Labs to determine when the demolition had occurred.
We used all these sources to build up a picture of where 8219 went, what it demolished and why.
`,
location: {
center: [34.35901, 31.42290],
zoom: 10.35,
pitch: defaultPitch,
bearing: defaultBearing
},
mapAnimation: ‘flyTo’,
rotateAnimation: false,
callback: ”,
onChapterEnter: [],
onChapterExit: []
},
{
id: ‘ar-0-1’,
alignment: ‘left’,
hidden: true,
showMarker: false,
location: {
center: [34.467369, 31.517994],
zoom: 12.5,
pitch: defaultPitch,
bearing: defaultBearing,
speed: 0.5
},
mapAnimation: ‘flyTo’,
rotateAnimation: false,
callback: ”,
onChapterEnter: [],
onChapterExit: []
},
{
id: ‘ar-1’,
alignment: ‘left’,
hidden: false,
showMarker: true,
title: ‘November 13-14 – Building’,
video: `https://bellingcat-embeds.ams3.cdn.digitaloceanspaces.com/2024-demolitions-8219/small/M2.mp4`,
description: `
The first demolition we identified which 8219 participated in occurred on November 13 or 14. Members of the unit demolished a two story building overlooking the Mediterranean Sea. No justification for this demolition was given in the post. `,
location: {
center: [34.413750, 31.500837],
zoom: 17,
pitch: 35,
bearing: -55,
speed: 0.75
},
mapAnimation: ‘flyTo’,
rotateAnimation: false,
callback: ”,
onChapterEnter: [],
onChapterExit: []
},
{
id: ‘ar-2’,
alignment: ‘left’,
hidden: false,
showMarker: true,
title: ‘November 20-23 – Residential Housing Blocks’,
video: `https://bellingcat-embeds.ams3.cdn.digitaloceanspaces.com/2024-demolitions-8219/small/M3.mp4`,
description: `
After this, the pace and scale of demolitions appeared to pick up considerably. Between November 20 and 23, the battalion participated in multiple demolitions of residential tower blocks immediately next to Al Quds Hospital in the neighbourhood of Tel al-Hawa, Gaza City.
`,
location: {
center: [34.431342, 31.505606],
zoom: 16.75,
bearing: 35,
pitch: defaultPitch,
},
mapAnimation: ‘flyTo’,
rotateAnimation: false,
callback: ”,
onChapterEnter: [],
onChapterExit: []
},
{
id: ‘ar-2-1’,
alignment: ‘left’,
hidden: false,
showMarker: true,
// title: ‘AR 2.1’,
video: `https://bellingcat-embeds.ams3.cdn.digitaloceanspaces.com/2024-demolitions-8219/small/M4.mp4`,
location: {
center: [34.431939, 31.506328],
zoom: 16.75,
bearing: 0,
pitch: 20,
speed: 0.15
},
mapAnimation: ‘flyTo’,
rotateAnimation: false,
callback: ”,
onChapterEnter: [],
onChapterExit: []
},
{
id: ‘ar-2-2’,
alignment: ‘left’,
hidden: false,
showMarker: true,
// title: ‘AR 2.2’,
video: `https://bellingcat-embeds.ams3.cdn.digitaloceanspaces.com/2024-demolitions-8219/small/M5.mp4`,
location: {
center: [34.432313, 31.505019],
zoom: 16.75,
bearing: -60,
pitch: 35,
speed: 0.15
},
mapAnimation: ‘flyTo’,
rotateAnimation: false,
callback: ”,
onChapterEnter: [],
onChapterExit: []
},
{
id: ‘ar-2-3’,
alignment: ‘left’,
hidden: false,
showMarker: true,
// title: ‘AR 2.3’,
video: `https://bellingcat-embeds.ams3.cdn.digitaloceanspaces.com/2024-demolitions-8219/small/M6.mp4`,
location: {
center: [34.433193, 31.504310],
zoom: 16.5,
bearing: 90,
pitch: 45,
speed: 0.15
},
mapAnimation: ‘flyTo’,
rotateAnimation: false,
callback: ”,
onChapterEnter: [],
onChapterExit: []
},
{
id: ‘ar-2-before’,
alignment: ‘left’,
hidden: false,
// showMarker: true,
title: ‘November 14, 2023 – Before’,
location: {
center: [34.432313, 31.505019],
zoom: 16.0,
pitch: defaultPitch,
bearing: defaultBearing,
speed: 0.2
},
mapAnimation: ‘flyTo’,
rotateAnimation: false,
callback: ”,
onChapterEnter: [
{
layer: ‘skysat_pre_m7’,
opacity: 1.0
},
],
onChapterExit: [
{
layer: ‘skysat_pre_m7’,
opacity: 0.0
},
]
},
{
id: ‘ar-2-after’,
alignment: ‘left’,
hidden: false,
// showMarker: true,
title: ‘November 26, 2023 – After’,
description: `
Satellite imagery of this neighbourhood shows that at least 34 residential housing blocks were either completely or partially destroyed during this time. As most of these blocks were seven to ten storeys high, this meant the demolition of a significant amount of homes.
`,
location: {
center: [34.432313, 31.505019],
zoom: 16.0,
pitch: defaultPitch,
bearing: defaultBearing,
speed: 0.2
},
mapAnimation: ‘flyTo’,
rotateAnimation: false,
callback: ”,
onChapterEnter: [
{
layer: ‘skysat_post_m7’,
opacity: 1.0
},
],
onChapterExit: [
{
layer: ‘skysat_post_m7’,
opacity: 0.0
},
]
},
{
id: ‘ar-2-captain-comment’,
alignment: ‘full’,
hidden: false,
// showMarker: true,
image: ‘https://bellingcat-embeds.ams3.cdn.digitaloceanspaces.com/2024-demolitions-8219/M7.1.png’,
title: ‘On November 19, the Captain wrote about finding rockets and a UAV at one location, which matches a Times of Israel report from this time. He did not explain why this discovery required the destruction of so many residential blocks. ‘,
location: {
center: [34.431342, 31.505606],
zoom: 15.5,
pitch: defaultPitch,
bearing: defaultBearing,
},
mapAnimation: ‘flyTo’,
rotateAnimation: false,
callback: ”,
onChapterEnter: [],
onChapterExit: []
},
{
id: ’20-ar-3′,
alignment: ‘left’,
hidden: false,
showMarker: true,
title: ‘December 7-10 – Building’,
video: `https://bellingcat-embeds.ams3.cdn.digitaloceanspaces.com/2024-demolitions-8219/small/M8.mp4`,
description: `Between December 7 and 10, another building was demolished.`,
location: {
center: [34.453641, 31.484915],
zoom: 17.5,
bearing: 180,
pitch: 60,
},
mapAnimation: ‘flyTo’,
rotateAnimation: false,
callback: ”,
onChapterEnter: [],
onChapterExit: []
},
{
id: ’22-ar-4′,
alignment: ‘left’,
hidden: false,
showMarker: true,
title: ‘December 10-15 – Al-Islah Mosque’,
video: `https://bellingcat-embeds.ams3.cdn.digitaloceanspaces.com/2024-demolitions-8219/small/M9.mp4`,
description: `Sometime between December 10 and 15, Al-Islah mosque and an adjacent building were demolished. Religious buildings receive protected status under International Humanitarian Law. An Instagram post depicting this mosque being prepared for demolition claimed that “Every house, mosque and school has been used here for terror purposes: either as a place for terrorists, an explosives warehouse or a military base”.`,
location: {
center: [34.468070, 31.496043],
zoom: 16.5,
pitch: 37,
bearing: 57,
},
mapAnimation: ‘flyTo’,
rotateAnimation: false,
callback: ”,
onChapterEnter: [],
onChapterExit: []
},
{
id: ’24-ar-4′,
alignment: ‘left’,
hidden: false,
showMarker: true,
image: ‘https://bellingcat-embeds.ams3.cdn.digitaloceanspaces.com/2024-demolitions-8219/M10.jpeg’,
// title: ‘AR 4’,
description: `
Several months later, on February 19 2024, the mosque’s Facebook page posted an image of the destroyed building, its minaret collapsed into the road. `,
location: {
center: [34.468070, 31.496043],
zoom: 16.5,
pitch: 37,
bearing: 57,
},
mapAnimation: ‘flyTo’,
rotateAnimation: false,
callback: ”,
onChapterEnter: [],
onChapterExit: []
},
{
id: ’25-ar-5a’,
alignment: ‘left’,
hidden: false,
showMarker: true,
video: `https://bellingcat-embeds.ams3.cdn.digitaloceanspaces.com/2024-demolitions-8219/small/M11.mp4`,
title: ‘December 17-19 – Buildings Around Al-Islah Mosque’,
description: `A few days after the Al-Islah mosque was destroyed, several demolitions took place in the neighbourhood around it. `,
location: {
center: [34.465878, 31.495545],
extraMarkers: [
[34.465620, 31.496134],
[34.467359, 31.497490]
],
zoom: 17,
bearing: 48,
pitch: 54,
speed: 0.25
},
mapAnimation: ‘flyTo’,
rotateAnimation: false,
callback: ”,
onChapterEnter: [],
onChapterExit: []
},
{
id: ’27-ar-6-0′,
alignment: ‘center’,
hidden: false,
showMarker: false,
title: `December 26 – January 3 – Neighbourhood in Khuza’a`,
description: `After the demolitions in the North of Gaza, the focus of the unit switched to Khuza’a, a town to the south east of Khan Younis. The Captain notes that a separate unit requested the help of 8219, indicating that their chain of command changed for this operation. `,
location: {
center: [34.363837, 31.309067],
zoom: 14.0,
bearing: 0,
pitch: 0,
speed: 0.75
},
mapAnimation: ‘flyTo’,
rotateAnimation: false,
callback: ”,
onChapterEnter: [],
onChapterExit: []
},
{
id: ’28-ar-6-3′,
alignment: ‘left’,
hidden: false,
showMarker: true,
// title: ‘AR 6.3’,
video: `https://bellingcat-embeds.ams3.cdn.digitaloceanspaces.com/2024-demolitions-8219/small/M12.mp4`,
description: `This operation included a large number of demolitions in the town of Khuza’a and Khirbat Ikhza’a. Between December 26 and January 6, the IDF bulldozed large areas and demolished buildings using explosives. `,
location: {
center: [34.365601, 31.309909],
zoom: 16.5,
bearing: 159,
pitch: 28,
speed: 0.5
},
mapAnimation: ‘flyTo’,
rotateAnimation: false,
callback: ”,
onChapterEnter: [],
onChapterExit: []
},
{
id: ’29-ar-6-1′,
alignment: ‘left’,
hidden: false,
showMarker: true,
// title: ‘AR 6.1’,
video: `https://bellingcat-embeds.ams3.cdn.digitaloceanspaces.com/2024-demolitions-8219/small/M13.mp4`,
location: {
center: [34.363392, 31.309775],
zoom: 16.5,
bearing: 45,
pitch: 30,
speed: 0.15
},
mapAnimation: ‘flyTo’,
rotateAnimation: false,
callback: ”,
onChapterEnter: [],
onChapterExit: []
},
{
id: ’32-ar-6′,
alignment: ‘left’,
hidden: false,
showMarker: true,
// title: ‘AR 6, 32’,
video: `https://bellingcat-embeds.ams3.cdn.digitaloceanspaces.com/2024-demolitions-8219/small/M14.mp4`,
location: {
center: [34.362480, 31.310544],
extraMarkers: [
[34.363994, 31.309201]
],
zoom: 16.5,
bearing: 45,
pitch: 30,
speed: 0.15
},
mapAnimation: ‘flyTo’,
rotateAnimation: false,
callback: ”,
onChapterEnter: [],
onChapterExit: []
},
{
id: ’33-ar-6-2′,
alignment: ‘left’,
hidden: false,
showMarker: true,
// title: ‘AR 6.2’,
video: `https://bellingcat-embeds.ams3.cdn.digitaloceanspaces.com/2024-demolitions-8219/small/M15.mp4`,
location: {
center: [34.363468, 31.308530],
zoom: 16.5,
bearing: 75,
pitch: 30,
speed: 0.15
},
mapAnimation: ‘flyTo’,
rotateAnimation: false,
callback: ”,
onChapterEnter: [],
onChapterExit: []
},
{
id: ’36-ar-7′,
alignment: ‘left’,
hidden: false,
showMarker: true,
// title: ‘AR 7’,
video: `https://bellingcat-embeds.ams3.cdn.digitaloceanspaces.com/2024-demolitions-8219/small/M16.mp4`,
location: {
center: [34.362235, 31.306816],
zoom: 17,
bearing: -41,
pitch: 38,
speed: 0.15
},
mapAnimation: ‘flyTo’,
rotateAnimation: false,
callback: ”,
onChapterEnter: [],
onChapterExit: []
},
{
id: ’39-ar-6-before-prep’,
alignment: ‘left’,
hidden: true,
location: {
center: [34.363994, 31.309201],
zoom: 15.75,
bearing: 45,
pitch: 15,
speed: 0.75
},
mapAnimation: ‘flyTo’,
rotateAnimation: false,
callback: ”,
onChapterEnter: [
],
onChapterExit: [
]
},
{
id: ’39-ar-6-before’,
alignment: ‘left’,
hidden: false,
// showMarker: true,
title: ‘December 2, 2023 – Before’,
// description: `Satellite imagery shows the extent of this destruction.`,
location: {
center: [34.363994, 31.309201],
zoom: 15.75,
bearing: 45,
pitch: 15,
speed: 0.75
},
mapAnimation: ‘flyTo’,
rotateAnimation: false,
callback: ”,
onChapterEnter: [
{
layer: ‘skysat_pre_m17’,
opacity: 1.0
},
],
onChapterExit: [
{
layer: ‘skysat_pre_m17′,
opacity: 0.0
},
]
},
{
id: ’39-ar-6-after’,
alignment: ‘left’,
hidden: false,
// showMarker: true,
title: ‘January 16, 2024 – After’,
description: `“We’ve become addicted to explosions,” The Captain said in a post on December 28. Satellite imagery shows the extent of this destruction. `,
location: {
center: [34.363994, 31.309201],
zoom: 15.75,
bearing: 45,
pitch: 15,
speed: 0.75
},
mapAnimation: ‘flyTo’,
rotateAnimation: false,
callback: ”,
onChapterEnter: [
{
layer: ‘skysat_post_m17’,
opacity: 1.0
},
],
onChapterExit: [
{
layer: ‘skysat_post_m17′,
opacity: 0.0
},
]
},
{
id: ’40-ar-6-captain-comment’,
alignment: ‘full’,
hidden: false,
// showMarker: true,
image: ‘https://bellingcat-embeds.ams3.cdn.digitaloceanspaces.com/2024-demolitions-8219/M18.png’,
title: ‘Khuza’a and Khirbat Ikhza’a are very close to the border with Israel. These demolitions appear to be part of an effort to create a “buffer zone” between Gaza and Israel. However, the Captain added further details in a Facebook post, describing this operation as one to take and “destroy the village of the murderers”.’,
location: {
center: [34.362480, 31.310544],
zoom: 14.5,
bearing: 45,
pitch: 15,
speed: 0.75
},
mapAnimation: ‘flyTo’,
rotateAnimation: false,
callback: ”,
onChapterEnter: [],
onChapterExit: []
},
{
id: ’31-ar-9′,
alignment: ‘left’,
hidden: false,
showMarker: true,
title: ‘January 12-15 – Neighbourhood in Khan Younis’,
video: `https://bellingcat-embeds.ams3.cdn.digitaloceanspaces.com/2024-demolitions-8219/small/M19a.mp4`,
description: `
The final demolition we identified took place in the heart of Khan Younis, a city in the south of the Gaza Strip, in mid January. The Captain posted at length about an operation on Facebook, including claiming that they had received more than 300 mines for use in the operation. Other soldiers posted images and videos from this location. `,
location: {
center: [34.305447, 31.342172],
zoom: 17.5,
bearing: -151,
pitch: 44,
},
mapAnimation: ‘flyTo’,
rotateAnimation: false,
callback: ”,
onChapterEnter: [],
onChapterExit: []
},
{
id: ’44-ar-9-1-before-prep’,
alignment: ‘left’,
hidden: true,
location: {
center: [34.305541, 31.342359],
zoom: 17,
bearing: 0,
pitch: 0,
speed: 0.5
},
mapAnimation: ‘flyTo’,
rotateAnimation: false,
callback: ”,
onChapterEnter: [],
onChapterExit: []
},
{
id: ’44-ar-9-1-before’,
alignment: ‘left’,
hidden: false,
title: ‘January 7, 2024 – Before’,
// description: `Planet Labs imagery shows a large area of destroyed buildings in Khan Younis, near where we geolocated the photos and videos from 8219 soldiers.`,
location: {
center: [34.305541, 31.342359],
zoom: 17,
bearing: 0,
pitch: 0,
speed: 0.5
},
mapAnimation: ‘flyTo’,
rotateAnimation: false,
callback: ”,
onChapterEnter: [
{
layer: ‘skysat_pre_m20’,
opacity: 1.0
},
],
onChapterExit: [
{
layer: ‘skysat_pre_m20′,
opacity: 0.0
},
]
},
{
id: ’44-ar-9-1-after’,
alignment: ‘left’,
hidden: false,
title: ‘January 19, 2024 – After’,
description: `Planet Labs imagery shows a large area of destroyed buildings in Khan Younis, near where we geolocated the photos and videos from 8219 soldiers.`,
location: {
center: [34.305541, 31.342359],
zoom: 17,
bearing: 0,
pitch: 0,
speed: 0.5
},
mapAnimation: ‘flyTo’,
rotateAnimation: false,
callback: ”,
onChapterEnter: [
{
layer: ‘skysat_post_m20’,
opacity: 1.0
},
],
onChapterExit: [
{
layer: ‘skysat_post_m20′,
opacity: 0.0
},
]
},
{
id: ’45-ar-9-1-extracts’,
alignment: ‘left’,
hidden: false,
image: ‘https://bellingcat-embeds.ams3.cdn.digitaloceanspaces.com/2024-demolitions-8219/M21.png’,
// title: ‘AR 9.1 Extracts’,
description: `A tour video from 8219 Commando claims that in 84 days of fighting they destroyed 49 tunnels and 662 buildings. Our partners at Scripps News interviewed a member of 8219, Yonatan Segal, who said “I think we are the unit, at least until we left, that blew up the most amount of houses in Gaza.”`,
location: {
center: [34.305541, 31.342359],
zoom: 17,
bearing: 0,
pitch: 0,
speed: 0.5
},
mapAnimation: ‘flyTo’,
rotateAnimation: false,
callback: ”,
onChapterEnter: [],
onChapterExit: []
},
{
id: ’46-ar-9-1-captain-1′,
alignment: ‘full’,
hidden: false,
// showMarker: true,
image: ‘https://bellingcat-embeds.ams3.cdn.digitaloceanspaces.com/2024-demolitions-8219/M22.png’,
title: ‘The Captain himself said they destroyed “thousands” of buildings, noting in a post on January 13, 2024 that his Commanding Officer told him there is “no precedent” for this in the IDF and that they had stopped counting the buildings they had destroyed. ‘,
location: {
center: [34.305541, 31.342359],
zoom: 17,
bearing: 0,
pitch: 0,
speed: 0.5
},
mapAnimation: ‘flyTo’,
rotateAnimation: false,
callback: ”,
onChapterEnter: [],
onChapterExit: []
},
{
id: ’47-ar-9-1-captain-2′,
alignment: ‘full’,
hidden: false,
// showMarker: true,
image: ‘https://bellingcat-embeds.ams3.cdn.digitaloceanspaces.com/2024-demolitions-8219/M23.png’,
title: ‘Sometimes soldiers did not give an explanation about why they carried out demolitions. Other times they listed a number of objectives or reasons for the demolitions. One of these appears to be seeking revenge. For instance, one post from the Captain notes his company commander described the destruction of swathes of Khuza’a as revenge for October 7 and deaths of soldiers.’,
location: {
center: [34.305541, 31.342359],
zoom: 17,
bearing: 0,
pitch: 0,
speed: 0.5
},
mapAnimation: ‘flyTo’,
rotateAnimation: false,
callback: ”,
onChapterEnter: [],
onChapterExit: []
},
{
id: ’48-ar-9-1-scripps’,
alignment: ‘center’,
hidden: false,
description: `
When interviewed by our partners Scripps News, 8219 member Yonatan Segal said he did not post about the demolitions on social media but had videos of them on his phone. Asked if revenge was one of the motivations behind the demolitions he said: “Yes. But what is revenge? Revenge in terms of teaching them a lesson, so to speak, so that they would never do that again.”
`,
location: {
center: [34.305541, 31.342359],
zoom: 17,
bearing: 0,
pitch: 0,
speed: 0.5
},
mapAnimation: ‘flyTo’,
rotateAnimation: false,
callback: ”,
onChapterEnter: [],
onChapterExit: []
},
{
id: ’49-ar-9-1′,
alignment: ‘center’,
hidden: false,
description: `Religious elements appear to creep in. In one post regarding the demolition in Khan Younis the Captain talks of using 400 mines to demolish a residential area “in honour of the Shabbat”. `,
location: {
center: [34.305541, 31.342359],
zoom: 17,
bearing: 0,
pitch: 0,
speed: 0.5
},
mapAnimation: ‘flyTo’,
rotateAnimation: false,
callback: ”,
onChapterEnter: [],
onChapterExit: []
},
{
id: ’50-ar-9-1′,
alignment: ‘center’,
hidden: false,
description: `
We asked Professor Balakrishnan Rajagopal, the UN’s Special Rapporteur on adequate housing and the Professor of Law and Development at the Massachusetts Institute of Technology about the demolitions carried out by 8219 Commando. He told us that these demolitions were relevant to the ICJ case on genocide, supporting South Africa’s case that Israel was, in effect, rendering Gaza uninhabitable. He noted that even if it was not possible to establish genocidal intent, widespread destruction rendering a place uninhabitable could still amount to a crime against humanity.
Further, he noted that the “buffer zone” being cleared by the IDF along the border with Gaza doesn’t fit the definition of such zones within the Geneva Conventions and is effectively a “land-grab” taking approximately 16% of Gaza’s land.
Mairav Zonszein, a Senior Analyst on Israel-Palestine at the International Crisis Group which monitors conflict, said the current conflict wasn’t the only example of demolitions of Palestinian homes by the IDF but it was “on a scope that we’ve never seen.”
She said there were a few reasons the demolitions were happening, ranging from revenge to an extremely punitive interpretation of ‘deradicalisation’.
“They have a policy of deterrence which means that if somebody fires at us, we’ll come back at them ten times harder”, Zonszein told Bellingcat.
“Essentially the aim of the offensive is to take apart Hamas as an entity, but they don’t distinguish. Part of that is destroying infrastructure and changing the urban fabric through demolitions”.
“They are trying to take apart a society.”
In addition to clearing the ‘buffer zone’, Zonszein said areas of northern Gaza had been largely depopulated and rendered completely uninhabitable by widespread destruction.
“The main thing they’ve done in this war is to empty the north of its people and make it almost impossible to live there.”
“The question is if what they’re doing and have done in the North of Gaza is part of a longer term plan to keep that part of the strip under Israeli occupation.”
`,
location: {
center: [34.305541, 31.342359],
zoom: 17,
bearing: 0,
pitch: 0,
speed: 0.5
},
mapAnimation: ‘flyTo’,
rotateAnimation: false,
callback: ”,
onChapterEnter: [],
onChapterExit: []
},
{
id: ’51-ar-9-1′,
alignment: ‘center’,
hidden: false,
description: `
We asked the IDF about each one of these incidents. They did not respond to specific questions nor did they provide evidence showing why the buildings we highlighted were demolished. They told us the IDF is “destroying terror infrastructures” embedded in civilian areas and said that in certain cases large parts of neighbourhoods are converted into combat complexes. They said the IDF is operating in the Gaza Strip to prevent Hamas activity threatening Israeli citizens and implementing a defence plan to improve security in southern Israel. IDF actions are based on military necessity and in accordance with international law, they said.
“There is no IDF doctrine that aims [at] causing maximal damage to civilian infrastructure regardless of military necessity,” they said. Adding that exceptional incidents occurring during the war will be examined by the General Staff’s Fact-Finding and Assessment Mechanism. “The IDF addresses exceptional incidents that deviate from the order and expected values of IDF soldiers by examining such events and implementing command and disciplinary measures as necessary.”
`,
location: {
center: [34.305541, 31.342359],
zoom: 17,
bearing: 0,
pitch: 0,
speed: 0.5
},
mapAnimation: ‘flyTo’,
rotateAnimation: false,
// callback: ‘callBackEnd’,
onChapterEnter: [],
onChapterExit: []
},
{
id: ‘ar-0-final’,
alignment: ‘full’,
hidden: true,
showMarker: false,
location: {
center: [34.35901, 31.42290],
zoom: 10.35,
pitch: defaultPitch,
bearing: defaultBearing,
},
mapAnimation: ‘flyTo’,
rotateAnimation: false,
// callback: ”,
onChapterEnter: [],
onChapterExit: [],
startAnimation: true
},
{
id: ‘ar-0-final-banner’,
alignment: ‘center’,
hidden: false,
showMarker: false,
title: `“We’ve Become Addicted to Explosions”
The IDF Unit Responsible for Demolishing Homes Across Gaza`,
description: `
Image Credits: All footage and images featured in the piece come from social media posts by members of the 8219 Commando. All satellite images which feature are courtesy of either ©2024 Planet Labs PBC or Google/Maxar.
Research: Nick Waters, Carlos Gonzales, Annique Mossou, Michael Sheldon, Natasha Pereverzina, Lucy Swinnen, Jake Godin
Visualisation: Miguel Ramalho
Translation: Eyal Weizman
Illustration: Ann Kiernan
`,
location: {
center: [34.35901, 31.42290],
zoom: 10.35,
pitch: defaultPitch,
bearing: defaultBearing,
},
mapAnimation: ‘flyTo’,
rotateAnimation: false,
// callback: ”,
onChapterEnter: [],
onChapterExit: [],
showCredits: true
},
]
};
var initLoad = true;
var layerTypes = {
‘fill’: [‘fill-opacity’],
‘line’: [‘line-opacity’],
‘circle’: [‘circle-opacity’, ‘circle-stroke-opacity’],
‘symbol’: [‘icon-opacity’, ‘text-opacity’],
‘raster’: [‘raster-opacity’],
‘fill-extrusion’: [‘fill-extrusion-opacity’],
‘heatmap’: [‘heatmap-opacity’]
}
var alignments = {
‘left’: ‘lefty’,
‘center’: ‘centered’,
‘right’: ‘righty’,
‘full’: ‘fully’
}
function getLayerPaintType(layer) {
var layerType = map.getLayer(layer).type;
return layerTypes[layerType];
}
function setLayerOpacity(layer) {
var paintProps = getLayerPaintType(layer.layer);
paintProps.forEach(function (prop) {
var options = {};
if (layer.duration) {
var transitionProp = prop + “-transition”;
options = {
“duration”: layer.duration
};
map.setPaintProperty(layer.layer, transitionProp, options);
}
map.setPaintProperty(layer.layer, prop, layer.opacity, options);
});
}
function newMarker() {
const markerEl = document.createElement(‘div’);
markerEl.className=”explosion-marker”;
return new mapboxgl.Marker(markerEl);
}
var story = document.getElementById(‘story’);
var features = document.createElement(‘div’);
features.setAttribute(‘id’, ‘features’);
var header = document.createElement(‘div’);
if (config.title) {
var titleText = document.createElement(‘h1’);
titleText.innerText = config.title;
header.appendChild(titleText);
}
if (config.subtitle) {
var subtitleText = document.createElement(‘h2’);
subtitleText.innerText = config.subtitle;
header.appendChild(subtitleText);
}
if (config.byline) {
var bylineText = document.createElement(‘p’);
bylineText.innerText = config.byline;
header.appendChild(bylineText);
}
if (header.innerText.length > 0) {
header.classList.add(config.theme);
header.setAttribute(‘id’, ‘header’);
story.appendChild(header);
}
config.chapters.forEach((record, idx) => {
var container = document.createElement(‘div’);
var chapter = document.createElement(‘div’);
if (record.title) {
let title = document.createElement(‘h3’);
// title.innerText = record.title;
title.innerHTML = record.title;
chapter.appendChild(title);
}
if (record.image) {
let image = new Image();
image.src = record.image;
chapter.appendChild(image);
}
if (record.video) {
let video = document.createElement(‘video’);
video.id = `video-${record.id}`;
video.src = record.video;
video.preload = ‘auto’;
video.setAttribute(‘playsinline’, ”);
video.autoplay = true;
video.muted = true;
video.loop = true;
video.textContent=”Your browser does not support the video tag.”;
const source = document.createElement(‘source’);
source.src = record.video;
source.type=”video/mp4″;
video.appendChild(source);
let videoDiv = document.createElement(‘div’);
videoDiv.classList.add(‘video-container’);
let overlayP = document.createElement(‘p’);
overlayP.classList.add(‘media-overlay’);
overlayP.innerHTML =
`${record.location.center[1].toFixed(4)},${record.location.center[0].toFixed(4)}`;
videoDiv.appendChild(video);
videoDiv.appendChild(overlayP);
chapter.appendChild(videoDiv);
}
if (record.description) {
let story = document.createElement(‘p’);
story.innerHTML = record.description;
chapter.appendChild(story);
}
container.setAttribute(‘id’, record.id);
container.classList.add(‘step’);
if (idx === 0) {
container.classList.add(‘active’);
}
chapter.classList.add(config.theme);
container.appendChild(chapter);
container.classList.add(alignments[record.alignment] || ‘centered’);
if (record.hidden) {
container.classList.add(‘hidden’);
}
features.appendChild(container);
});
story.appendChild(features);
var footer = document.createElement(‘div’);
if (config.footer) {
var footerText = document.createElement(‘p’);
footerText.innerHTML = config.footer;
footer.appendChild(footerText);
}
if (footer.innerText.length > 0) {
footer.classList.add(config.theme);
footer.setAttribute(‘id’, ‘footer’);
story.appendChild(footer);
}
mapboxgl.accessToken = config.accessToken;
const transformRequest = (url) => {
const hasQuery = url.indexOf(“?”) !== -1;
const suffix = hasQuery ? “&pluginName=scrollytellingV2” : “?pluginName=scrollytellingV2”;
return {
url: url + suffix
}
}
var map = new mapboxgl.Map({
container: ‘map’,
style: config.style,
center: config.chapters[0].location.center,
zoom: config.chapters[0].location.zoom,
bearing: config.chapters[0].location.bearing,
pitch: config.chapters[0].location.pitch,
interactive: false,
transformRequest: transformRequest,
projection: config.projection,
attributionControl: false
}).addControl(new mapboxgl.AttributionControl({
customAttribution: ‘Bell¿ngcat’
}));
var markers = {};
// Create a inset map if enabled in config.js
if (config.inset) {
var insetMap = new mapboxgl.Map({
container: ‘mapInset’, // container id
style: ‘mapbox://styles/mapbox/dark-v10’, //hosted style id
center: config.chapters[0].location.center,
// Hardcode above center value if you want insetMap to be static.
zoom: 3, // starting zoom
hash: false,
interactive: false,
attributionControl: false,
//Future: Once official mapbox-gl-js has globe view enabled,
//insetmap can be a globe with the following parameter.
//projection: ‘globe’
});
}
// instantiate the scrollama
var scroller = scrollama();
map.on(“load”, function () {
if (config.use3dTerrain) {
map.addSource(‘mapbox-dem’, {
‘type’: ‘raster-dem’,
‘url’: ‘mapbox://mapbox.mapbox-terrain-dem-v1′,
’tileSize’: 512,
‘maxzoom’: 14
});
// add the DEM source as a terrain layer with exaggerated height
map.setTerrain({
‘source’: ‘mapbox-dem’,
‘exaggeration’: 1.5
});
// add a sky layer that will show when the map is highly pitched
map.addLayer({
‘id’: ‘sky’,
‘type’: ‘sky’,
‘paint’: {
‘sky-type’: ‘atmosphere’,
‘sky-atmosphere-sun’: [0.0, 0.0],
‘sky-atmosphere-sun-intensity’: 15
}
});
};
// As the map moves, grab and update bounds in inset map.
if (config.inset) {
map.on(‘move’, getInsetBounds);
}
// add journey path layer
const journeyCoordinates = config.journey.features[0].geometry.coordinates;
config.journey.features[0].geometry.coordinates = [];
map.addSource(‘trace’, {
type: ‘geojson’,
data: config.journey
});
map.addLayer({
‘id’: ‘trace’,
‘type’: ‘line’,
‘source’: ‘trace’,
‘layout’: {
‘line-cap’: ’round’,
},
‘paint’: {
‘line-color’: ‘#D50000’,
// ‘line-color’: ‘white’,
‘line-width’: 6,
‘line-opacity’: 0.7,
}
});
const videoGrid = document.getElementById(‘video-grid’);
const videoDivs = Array.from(videoGrid.querySelectorAll(‘div > video’));
const journeyDivs = [0, 0, 1, 7, 8, 11, 12, 15, 16, 17, 18, 19];
const scrollOverlay = document.getElementById(‘scroll-overlay’);
let scrollOverlayGone = false;
setTimeout(() => {
if (!scrollOverlayGone) {
scrollOverlay.style.display = “block”;
}
}, 3000);
// setup the instance, pass callback functions
scroller
.setup({
step: ‘.step’,
offset: 0.5,
progress: true
})
.onStepEnter(async response => {
var current_chapter = config.chapters.findIndex(chap => chap.id === response.element
.id);
var chapter = config.chapters[current_chapter];
response.element.classList.add(‘active’);
map[chapter.mapAnimation || ‘flyTo’]({
…chapter.location,
speed: response.direction == “up” ? 1.0 : (chapter.location.speed ||
1.0)
});
// Incase you do not want to have a dynamic inset map,
// rather want to keep it a static view but still change the
// bbox as main map move: comment out the below if section.
if (config.inset) {
if (chapter.location.zoom {
if (!chap.showMarker) {
return;
}
(markers[chap.id] || []).forEach(m => m.remove());
if (cid {
var marker = newMarker();
marker.setLngLat(location).addTo(map);
if (cid != current_chapter) {
marker.addClassName(‘seen’);
}
markers[chap.id] = markers[chap.id] || [];
markers[chap.id].push(marker);
});
}
})
if (chapter.startAnimation && response.direction == “down”) {
videoGrid.setAttribute(‘style’, ‘display: flex;’);
for (let i = 0; i {
config.journey.features[0].geometry.coordinates =
journeyCoordinates.slice(0, i);
map.getSource(‘trace’).setData(config.journey);
}, 1500 + i * 500);
}
for (let i = 0; i {
videoDivs[i].setAttribute(‘style’, ‘visibility: visible;’);
}, 1500 + i * 550);
}
}
if (chapter.onChapterEnter.length > 0) {
chapter.onChapterEnter.forEach(setLayerOpacity);
}
if (chapter.callback) {
window[chapter.callback]();
}
if (chapter.rotateAnimation) {
map.once(‘moveend’, () => {
const rotateNumber = map.getBearing();
map.rotateTo(rotateNumber + 180, {
duration: 30000,
easing: function (t) {
return t;
}
});
});
}
if (config.auto) {
var next_chapter = (current_chapter + 1) % config.chapters.length;
map.once(‘moveend’, () => {
document.querySelectorAll(‘[data-scrollama-index=”‘ + next_chapter
.toString() + ‘”]’)[0].scrollIntoView();
});
}
})
.onStepExit(response => {
if (!scrollOverlayGone) {
scrollOverlay.style.display = “none”;
scrollOverlayGone = true;
}
var chapter = config.chapters.find(chap => chap.id === response.element.id);
response.element.classList.remove(‘active’);
if (chapter.onChapterExit.length > 0) {
chapter.onChapterExit.forEach(setLayerOpacity);
}
if (chapter.startAnimation && response.direction == “up”) {
videoGrid.setAttribute(‘style’, ‘display: none;’);
videoDivs.forEach((v, i) => {
v.setAttribute(‘style’, ‘visibility: hidden;’);
});
config.journey.features[0].geometry.coordinates =
journeyCoordinates.slice(0, 0);
map.getSource(‘trace’).setData(config.journey);
}
});
if (config.auto) {
document.querySelectorAll(‘[data-scrollama-index=”0″]’)[0].scrollIntoView();
}
});
//Helper functions for insetmap
function getInsetBounds() {
let bounds = map.getBounds();
let boundsJson = {
“type”: “FeatureCollection”,
“features”: [{
“type”: “Feature”,
“properties”: {},
“geometry”: {
“type”: “Polygon”,
“coordinates”: [
[
[
bounds._sw.lng,
bounds._sw.lat
],
[
bounds._ne.lng,
bounds._sw.lat
],
[
bounds._ne.lng,
bounds._ne.lat
],
[
bounds._sw.lng,
bounds._ne.lat
],
[
bounds._sw.lng,
bounds._sw.lat
]
]
]
}
}]
}
if (initLoad) {
addInsetLayer(boundsJson);
initLoad = false;
} else {
updateInsetLayer(boundsJson);
}
}
function addInsetLayer(bounds) {
insetMap.addSource(‘boundsSource’, {
‘type’: ‘geojson’,
‘data’: bounds
});
insetMap.addLayer({
‘id’: ‘boundsLayer’,
‘type’: ‘fill’,
‘source’: ‘boundsSource’, // reference the data source
‘layout’: {},
‘paint’: {
‘fill-color’: ‘#fff’, // blue color fill
‘fill-opacity’: 0.2
}
});
// // Add a black outline around the polygon.
insetMap.addLayer({
‘id’: ‘outlineLayer’,
‘type’: ‘line’,
‘source’: ‘boundsSource’,
‘layout’: {},
‘paint’: {
‘line-color’: ‘#000’,
‘line-width’: 1
}
});
}
function updateInsetLayer(bounds) {
insetMap.getSource(‘boundsSource’).setData(bounds);
}
// setup resize event
window.addEventListener(‘resize’, scroller.resize);
Bellingcat is a non-profit and the ability to carry out our work is dependent on the kind support of individual donors. If you would like to support our work, you can do so here. You can also subscribe to our Patreon channel here. Subscribe to our Newsletter and follow us on Instagram here, YouTube here, Facebook here, Twitter here and Mastodon here.
The post “We’ve Become Addicted to Explosions” The IDF Unit Responsible for Demolishing Homes Across Gaza appeared first on bellingcat.