
Cr. Courtesy of Netflix © 2026
Netflix’s hit treasure-hunting series Outer Banks has finally come to a close after five huge seasons, taking us on a wild ride from the marshy coastlines of Kildare Island to the far reaches of the globe.
As die-hard fans know, the biggest behind-the-scenes secret of the show’s early days is that the “OBX” wasn’t actually filmed in North Carolina. Due to inclusivity concerns over a controversial bathroom bill during the show’s early development, production instead set up shop in Charleston, South Carolina. For the first three seasons, the stunning Lowcountry—including spots like Mount Pleasant’s Shem Creek, Kiawah Island, and the historic Secessionville Historic District—perfectly doubled for the North Carolina barrier islands.
As John B and the Pogues’ hunt for gold escalated from local shipwrecks to legendary lost cities, the production’s footprint had to evolve, too. The series quickly went international, with the gorgeous island of Barbados stepping in to double for the sun-drenched streets of the Bahamas in Season 2, as well as the mythical jungles of South America in Season 3. By Season 4, the crew finally made their way to the real North Carolina to film the high-stakes Enduro dirt bike race, while simultaneously pushing the boundaries of “Pogue hell” with a grueling, cinematic shoot in the desert dunes and historic medinas of Morocco.
For the fifth and final season, the Pogues took their ultimate globe-trotting adventure to the Mediterranean. Swapping the Atlantic shoals for the Adriatic coast, production touched down in Croatia. The UNESCO-protected medieval streets of Dubrovnik, the rugged cliffs of Danče Beach, and the lush nature reserve of Lokrum Island provided an epic, jaw-dropping backdrop for the show’s final chapter.
Whether you’re looking to grab a bite at the real-life Wreck, trace the muddy tracks of the Enduro race, or plan a European getaway to follow the trail of the Blue Crown, we’ve got you covered. To help you live your best Pogue life, we’ve compiled a massive, interactive directory of every major spot used in the series.
Grab your compass and explore our ultimate Outer Banks filming tour widget below, featuring over 60 real-world locations across all five seasons!
Outer Banks Seasons 1-5 Filming Guide Tour
62 filming locations
-
1
★
The Chateau
Central filming location
Secessionville Historic District, Charleston, SC
John B's iconic waterfront home and Pogue meeting ground.
Directions
Street View
-
2
Tannyhill Plantation
Lowndes Grove, Charleston, SC
The Cameron family's extravagant waterfront estate.
Directions
Street View
-
3
UNC Chapel Hill Law Library
Charleston Gaillard Center, Charleston, SC
John B and Sarah dig through Denmark Tanny archives.
Directions
Street View
-
4
Ben Silver
King Street, Charleston, SC
John B gets a seersucker makeover for a Kook event.
Directions
Street View
-
5
Carla Limbrey’s Home
Edmondston-Alston House, Charleston, SC
Pope meets with Carla Limbrey to discuss the Denmark Key.
Directions
Street View
-
6
The Charleston Museum
360 Meeting St, Charleston, SC
Big John and John B pull off a heist to steal the Gnomon of Solana.
Directions
Street View
-
7
Ferry Dock & First Kiss
Charleston Maritime Center, Charleston, SC
John B and Sarah share their first kiss in the rain.
Directions
Street View
-
8
Freedman’s Assembly of God
St. Thomas & St. Denis Parish, Cainhoy, SC
Abandoned church hiding the Cross of Santo Domingo.
Directions
Street View
-
9
Poguelandia 2.0
Maybank Highway, Charleston, SC
The Pogues' new home and bait shop built from scratch.
Directions
Street View
-
10
7-Eleven
Crosby’s Fish & Shrimp Company, Charleston, SC
The local convenience store where the Pogues check their bank balance.
Directions
Street View
-
11
Rockfish Bar
Bowens Island Restaurant, Charleston, SC
JJ trades his dirt bike for information on Blackbeard's treasure coordinates.
Directions
Street View
-
12
The Catacombs
Old Exchange Building, Charleston, SC
Rat-filled crypts hiding clues to Blackbeard's treasure.
Directions
Street View
-
13
The Shoals
Fort Johnson, Charleston, SC
Shallow landing where the Pogues crash their leaking boat.
Directions
Street View
-
14
Ellie's High House / Big John's Tavern
E. Bay Street, Charleston, SC
Stood in for the French Quarter of New Orleans.
Directions
Street View
-
15
Heyward’s Seafood
Geechie Seafood, Mount Pleasant, SC
Pope’s family seafood business on Shem Creek.
Directions
Street View
-
16
The Wreck
The Wreck of the Richard and Charlene, Mount Pleasant, SC
Kiara's family restaurant and popular Pogue hangout.
Directions
Street View
-
17
Hawk’s Nest Tower
Palmetto Park Islands Observation Tower, Mount Pleasant, SC
Topper pushes John B off this ledge in a jealous rage.
Directions
Street View
-
18
Arthur Ravenel Jr. Bridge
Charleston, SC
The massive viaduct connecting Charleston to Mount Pleasant.
Directions
Street View
-
19
Pitt St. Pharmacy
Pitt Street, Mount Pleasant, SC
Sarah takes a pregnancy test and confides in Kiara.
Directions
Street View
-
20
Hollis' Boat
Toler's Cove Marina, Mount Pleasant, SC
Hollis invites Rafe to her boat with a real estate proposal.
Directions
Street View
-
21
Kildare County Detention Center
International Diving Institute, North Charleston, SC
John B awaits his fate in jail while JJ plots his escape.
Directions
Street View
-
22
Blackstone Manor on Goat Island
Admiral’s House, North Charleston, SC
Genrette's creepy estate on Sandfly Bluff.
Directions
Street View
-
23
Zeasy Realty Co.
Gatekeepers Inn, North Charleston, SC
Dale Zeasy's real estate office which JJ trashes.
Directions
Street View
-
24
Military Recruiter’s Office
Quarters J, North Charleston, SC
Pope’s tense meeting with the Marines.
Directions
Street View
-
25
The Boneyard
Hunting Island State Park, SC
Driftwood-covered beaches used for the Boneyard and Surfrider cleanup.
Directions
Street View
-
26
Redfield Lighthouse
Hunting Island Lighthouse, SC
Historic lighthouse John B and Kiara visit for clues.
Directions
Street View
-
27
Island Club
Kiawah Island Golf Resort, SC
Lavish resort used for the Kook Midsummers party and Dale's golf game.
Directions
Street View
-
28
Island Inn
Seabrook Island Beach Club, SC
The Kook location where JJ gets fired from his summer job.
Directions
Street View
-
29
Kitty Hawk Adventure Therapy
St. Christopher Camp, Seabrook Island, SC
The behavioral camp Kiara is ambushed and sent to.
Directions
Street View
-
30
John B’s Bell Tower
Old Bethel AME Church, McClellanville, SC
Abandoned Civil War-era church that eventually burns down.
Directions
Street View
-
31
Guerin’s Pharmacy
Main Street, Summerville, SC
Pope finds the Denmark Key hidden in his grandmother's ceiling.
Directions
Street View
-
32
Mr. Sunn’s House
Johns Island, SC
The Pogues' favorite teacher's residence where they decipher the amulet.
Directions
Street View
-
33
Barry’s Compound
Johns Island, SC
The rural drug compound where John B runs into major trouble.
Directions
Street View
-
34
Groff’s Boathouse & The Castle
Richmond Plantation, Cordesville, SC
Used for Groff's hideout and Ellie's English countryside-style estate.
Directions
Street View
-
35
Wincloss House
Josie Ridge Lane, Wadmalaw Island, SC
The quiet, unspoiled estate hosting the masquerade ball.
Directions
Street View
-
36
The Enduro Race (Beach)
Fort Fisher State Recreation Area, Kure Beach, NC
Location of the high-stakes Enduro dirt bike race on the sand.
Directions
Street View
-
37
The Enduro Race (Woods)
Copperhead Ranch, Rocky Point, NC
Muddy woodland portion of the dirt bike race.
Directions
Street View
-
38
Nassau Streets
Careenage, Bridgetown, Barbados
Stood in for the Bahamas when John B and Sarah escape.
Directions
Street View
-
39
Fairmont Hotel
Fairmont Royal Pavilion, Barbados
The Cameron family luxury vacation hotel.
Directions
Street View
-
40
Paradise Island Mansion
Royal Westmoreland, Barbados
Luxury home the Pogues break into looking for stolen gold.
Directions
Street View
-
41
Poguelandia
Bathsheba Beach, Barbados
Deserted island with dramatic rock formations where the Pogues wash ashore.
Directions
Street View
-
42
Plane Crash
Port St. Charles, Barbados
The Pogues ambush their pilot and crash the plane into the ocean.
Directions
Street View
-
43
The Camerons’ Guadalupe Estate
Cattlewash Beach, Barbados
Ward and Rafe hide out with the Cross of Santo Domingo.
Directions
Street View
-
44
Carlos Singh’s Estate
Lion Castle Estate, Barbados
Historic site standing in for Singh's heavily guarded compound.
Directions
Street View
-
45
Big John’s Bell Tower
St. John Parish Church, Barbados
Big John rings the historic church bell to signal his son.
Directions
Street View
-
46
El Dorado Cave
Welchman Hall Gully, Barbados
Tropical nature park representing South America's mythical city of gold.
Directions
Street View
-
47
The Moroccan Beach
Cap Hadid, Morocco
The Pogues wash up on desert dunes after surviving an Atlantic storm.
Directions
Street View
-
48
Essaouira
Essaouira, Morocco
Port city where the Pogues explore the medina and wharf looking for Groff.
Directions
Street View
-
49
Agapenta / The Blue Crown
Ouarzazate, Morocco
The door of the desert labyrinth where JJ ultimately finds the Blue Crown.
Directions
Street View
-
50
Old Town Dubrovnik
Dubrovnik, Croatia
The UNESCO-protected Old Town served as the main base for several days of filming. Its narrow stone streets used for motorcycle chase and preserved medieval look make it suitable for different settings without major modifications.
Directions
Street View
-
51
Stradun
Stradun, Dubrovnik, Croatia
Dubrovnik’s main promenade was closed during parts of the filming schedule. With its polished limestone pavement and historic façades, Stradun offers a cinematic backdrop immediately recognizable to viewers.
Directions
Street View
-
52
Old Port (Porat)
Old Port, Dubrovnik, Croatia
The picturesque old harbor, framed by Saint John Fortress, was used for multiple scenes involving boats and waterfront action — a natural choice for a series deeply connected to boats and coastal life.
Directions
Street View
-
53
Luža Square
Luža Square, Dubrovnik, Croatia
One of the most iconic squares in Dubrovnik, located next to Sponza Palace and the Church of St. Blaise. A popular filming location thanks to its open layout and historical buildings.
Directions
Street View
-
54
Sponza Palace
Sponza Palace, Dubrovnik, Croatia
A striking 16th-century palace used in many international productions. The courtyard and façade are ideal for scenes requiring historical ambience.
Directions
Street View
-
55
Jesuit Staircase
Jesuit Staircase, Dubrovnik, Croatia
One of the most famous staircases in Croatia, leading to the Church of St. Ignatius. Known worldwide from Game of Thrones, the stairs have once again become a star filming location.
Directions
Street View
-
56
Franciscan Monastery
Franciscan Monastery, Dubrovnik, Croatia
Located near Pile Gate, the monastery and its cloister provide a visually rich setting with impressive stone architecture.
Directions
Street View
-
57
Danče Beach
Danče Beach, Dubrovnik, Croatia
A rugged, rocky beach west of the Old Town. Danče is known for dramatic waves and cliffs — a perfect match for action-focused scenes.
Directions
Street View
-
58
Sesame Restaurant Area
Dante Alighierija, Dubrovnik, Croatia
The small park and pathways near Restaurant Sesame were used for part of the outdoor sequences.
Directions
Street View
-
59
Lapad Marina in Gruž Harbour
Gruž Harbour, Dubrovnik, Croatia
A modern marina area frequently used for logistics and filming involving boats. The contrast between historic Old Town and the Gruž harbor gives the production diversity in visual style.
Directions
Street View
-
60
Srđ Mountain
Mount Srđ, Dubrovnik, Croatia
The panoramic viewpoint above Dubrovnik, reachable by cable car, offers one of the best views in Croatia. A natural choice for wide establishing shots.
Directions
Street View
-
61
Lokrum Island
Lokrum Island, Dubrovnik, Croatia
Just 10 minutes from Old Town by boat, this lush nature reserve was used for several outdoor scenes. Lokrum’s botanical gardens, rocky coastline, and monastery ruins are favorites among film crews.
Directions
Street View
-
62
Cavtat
Cavtat, Croatia
The charming coastal town south of Dubrovnik served as an additional filming location. Known for its waterfront promenade and old center, Cavtat provides a quieter but equally photogenic setting.
Directions
Street View
- No matching locations.
[ allStops = JSON.parse(dataEl.textContent ,,,,,,, ‘[]’); ,
var code = stop.country_code ,,,
var code = btn.getAttribute(‘data-country’) ,
var hash = (window.location.hash ,, ‘[]’); ,,,
var tag = btn.getAttribute(‘data-tag’) ,, '').replace(/^#/, '');
var match = hash.match(/^stop-(\d+)$/);
return match ? match[1] : '';
,
searchQuery = String(raw , ‘[]’); ,
var code = stop.country_code ,
var hay = searchHaystacks[idx] , ”;
var isAll = tag === ”;
var active = isAll ? selectedTags.length === 0 : selectedTags.indexOf(tag) !== -1;
btn.classList.toggle(‘is-active’, active);
btn.setAttribute(‘aria-pressed’, active ? ‘true’ : ‘false’);
, ”;
var isAll = code === ”;
var active = isAll ? selectedCountries.length === 0 : selectedCountries.indexOf(code) !== -1;
btn.classList.toggle(‘is-active’, active);
btn.setAttribute(‘aria-pressed’, active ? ‘true’ : ‘false’);
,, ”).toLowerCase().replace(/\s+/g, ‘ ‘).trim();
searchTokens = searchQuery ? searchQuery.split(‘ ‘).filter(Boolean) : [];
if (searchClear) searchClear.hidden = searchQuery === ”;
,{“id”:29,”name”:”Kitty Hawk Adventure Therapy”,”address”:”St. Christopher Camp, Seabrook Island, SC”,”tagline”:”The behavioral camp Kiara is ambushed and sent to.”,”scene_note”:””,”visit_tip”:””,”access”:”public”,”access_label”:”Public”,”photo”:””,”lat”:32.58550000000000324007487506605684757232666015625,”lng”:-80.162000000000006139089236967265605926513671875,”tags”:[“season-3″],”country_code”:”us”,”country”:”United States”,”central”:false},{“id”:30,”name”:”John B\u2019s Bell Tower”,”address”:”Old Bethel AME Church, McClellanville, SC”,”tagline”:”Abandoned Civil War-era church that eventually burns down.”,”scene_note”:””,”visit_tip”:””,”access”:”public”,”access_label”:”Public”,”photo”:””,”lat”:33.08409999999999939745976007543504238128662109375,”lng”:-79.4677999999999968849806464277207851409912109375,”tags”:[“season-1″,”season-2″],”country_code”:”us”,”country”:”United States”,”central”:false},{“id”:31,”name”:”Guerin\u2019s Pharmacy”,”address”:”Main Street, Summerville, SC”,”tagline”:”Pope finds the Denmark Key hidden in his grandmother\u0027s ceiling.”,”scene_note”:””,”visit_tip”:””,”access”:”public”,”access_label”:”Public”,”photo”:””,”lat”:33.01830000000000353566065314225852489471435546875,”lng”:-80.175399999999996225596987642347812652587890625,”tags”:[“season-2″],”country_code”:”us”,”country”:”United States”,”central”:false},{“id”:32,”name”:”Mr. Sunn\u2019s House”,”address”:”Johns Island, SC”,”tagline”:”The Pogues\u0027 favorite teacher\u0027s residence where they decipher the amulet.”,”scene_note”:””,”visit_tip”:””,”access”:”public”,”access_label”:”Public”,”photo”:””,”lat”:32.73029999999999972715158946812152862548828125,”lng”:-80.0544000000000011141310096718370914459228515625,”tags”:[“season-4″],”country_code”:”us”,”country”:”United States”,”central”:false},{“id”:33,”name”:”Barry\u2019s Compound”,”address”:”Johns Island, SC”,”tagline”:”The rural drug compound where John B runs into major trouble.”,”scene_note”:””,”visit_tip”:””,”access”:”public”,”access_label”:”Public”,”photo”:””,”lat”:32.74000000000000198951966012828052043914794921875,”lng”:-80.06000000000000227373675443232059478759765625,”tags”:[“season-5″],”country_code”:”us”,”country”:”United States”,”central”:false},{“id”:34,”name”:”Groff\u2019s Boathouse \u0026 The Castle”,”address”:”Richmond Plantation, Cordesville, SC”,”tagline”:”Used for Groff\u0027s hideout and Ellie\u0027s English countryside-style estate.”,”scene_note”:””,”visit_tip”:””,”access”:”public”,”access_label”:”Public”,”photo”:””,”lat”:33.14920000000000044337866711430251598358154296875,”lng”:-79.897300000000001318767317570745944976806640625,”tags”:[“season-4″,”season-5″],”country_code”:”us”,”country”:”United States”,”central”:false},{“id”:35,”name”:”Wincloss House”,”address”:”Josie Ridge Lane, Wadmalaw Island, SC”,”tagline”:”The quiet, unspoiled estate hosting the masquerade ball.”,”scene_note”:””,”visit_tip”:””,”access”:”public”,”access_label”:”Public”,”photo”:””,”lat”:32.63969999999999771489456179551780223846435546875,”lng”:-80.159999999999996589394868351519107818603515625,”tags”:[“season-5″],”country_code”:”us”,”country”:”United States”,”central”:false},{“id”:36,”name”:”The Enduro Race (Beach)”,”address”:”Fort Fisher State Recreation Area, Kure Beach, NC”,”tagline”:”Location of the high-stakes Enduro dirt bike race on the sand.”,”scene_note”:””,”visit_tip”:””,”access”:”public”,”access_label”:”Public”,”photo”:””,”lat”:33.9534000000000020236257114447653293609619140625,”lng”:-77.9351999999999947021933621726930141448974609375,”tags”:[“season-4″],”country_code”:”us”,”country”:”United States”,”central”:false},{“id”:37,”name”:”The Enduro Race (Woods)”,”address”:”Copperhead Ranch, Rocky Point, NC”,”tagline”:”Muddy woodland portion of the dirt bike race.”,”scene_note”:””,”visit_tip”:””,”access”:”public”,”access_label”:”Public”,”photo”:””,”lat”:34.4266999999999967485564411617815494537353515625,”lng”:-77.885999999999995679900166578590869903564453125,”tags”:[“season-4″],”country_code”:”us”,”country”:”United States”,”central”:false},{“id”:38,”name”:”Nassau Streets”,”address”:”Careenage, Bridgetown, Barbados”,”tagline”:”Stood in for the Bahamas when John B and Sarah escape.”,”scene_note”:””,”visit_tip”:””,”access”:”public”,”access_label”:”Public”,”photo”:””,”lat”:13.0950000000000006394884621840901672840118408203125,”lng”:-59.61569999999999680539986002258956432342529296875,”tags”:[“season-2″],”country_code”:”bb”,”country”:”Barbados”,”central”:false},{“id”:39,”name”:”Fairmont Hotel”,”address”:”Fairmont Royal Pavilion, Barbados”,”tagline”:”The Cameron family luxury vacation hotel.”,”scene_note”:””,”visit_tip”:””,”access”:”public”,”access_label”:”Public”,”photo”:””,”lat”:13.2062000000000008270717444247566163539886474609375,”lng”:-59.6415999999999968395059113390743732452392578125,”tags”:[“season-2″],”country_code”:”bb”,”country”:”Barbados”,”central”:false},{“id”:40,”name”:”Paradise Island Mansion”,”address”:”Royal Westmoreland, Barbados”,”tagline”:”Luxury home the Pogues break into looking for stolen gold.”,”scene_note”:””,”visit_tip”:””,”access”:”public”,”access_label”:”Public”,”photo”:””,”lat”:13.2065000000000001278976924368180334568023681640625,”lng”:-59.627600000000001045918907038867473602294921875,”tags”:[“season-2″],”country_code”:”bb”,”country”:”Barbados”,”central”:false},{“id”:41,”name”:”Poguelandia”,”address”:”Bathsheba Beach, Barbados”,”tagline”:”Deserted island with dramatic rock formations where the Pogues wash ashore.”,”scene_note”:””,”visit_tip”:””,”access”:”public”,”access_label”:”Public”,”photo”:””,”lat”:13.213100000000000733280103304423391819000244140625,”lng”:-59.5217999999999989313437254168093204498291015625,”tags”:[“season-2″,”season-3″],”country_code”:”bb”,”country”:”Barbados”,”central”:false},{“id”:42,”name”:”Plane Crash”,”address”:”Port St. Charles, Barbados”,”tagline”:”The Pogues ambush their pilot and crash the plane into the ocean.”,”scene_note”:””,”visit_tip”:””,”access”:”public”,”access_label”:”Public”,”photo”:””,”lat”:13.262499999999999289457264239899814128875732421875,”lng”:-59.6467999999999989313437254168093204498291015625,”tags”:[“season-3″],”country_code”:”bb”,”country”:”Barbados”,”central”:false},{“id”:43,”name”:”The Camerons\u2019 Guadalupe Estate”,”address”:”Cattlewash Beach, Barbados”,”tagline”:”Ward and Rafe hide out with the Cross of Santo Domingo.”,”scene_note”:””,”visit_tip”:””,”access”:”public”,”access_label”:”Public”,”photo”:””,”lat”:13.2201000000000004064304448547773063182830810546875,”lng”:-59.5311999999999983401721692644059658050537109375,”tags”:[“season-3″],”country_code”:”bb”,”country”:”Barbados”,”central”:false},{“id”:44,”name”:”Carlos Singh\u2019s Estate”,”address”:”Lion Castle Estate, Barbados”,”tagline”:”Historic site standing in for Singh\u0027s heavily guarded compound.”,”scene_note”:””,”visit_tip”:””,”access”:”public”,”access_label”:”Public”,”photo”:””,”lat”:13.1895000000000006679101716144941747188568115234375,”lng”:-59.569400000000001682565198279917240142822265625,”tags”:[“season-3″],”country_code”:”bb”,”country”:”Barbados”,”central”:false},{“id”:45,”name”:”Big John\u2019s Bell Tower”,”address”:”St. John Parish Church, Barbados”,”tagline”:”Big John rings the historic church bell to signal his son.”,”scene_note”:””,”visit_tip”:””,”access”:”public”,”access_label”:”Public”,”photo”:””,”lat”:13.1763999999999992240873325499705970287322998046875,”lng”:-59.51610000000000155750967678613960742950439453125,”tags”:[“season-3″],”country_code”:”bb”,”country”:”Barbados”,”central”:false},{“id”:46,”name”:”El Dorado Cave”,”address”:”Welchman Hall Gully, Barbados”,”tagline”:”Tropical nature park representing South America\u0027s mythical city of gold.”,”scene_note”:””,”visit_tip”:””,”access”:”public”,”access_label”:”Public”,”photo”:””,”lat”:13.1956000000000006622258297284133732318878173828125,”lng”:-59.57679999999999864712663111276924610137939453125,”tags”:[“season-3″],”country_code”:”bb”,”country”:”Barbados”,”central”:false},{“id”:47,”name”:”The Moroccan Beach”,”address”:”Cap Hadid, Morocco”,”tagline”:”The Pogues wash up on desert dunes after surviving an Atlantic storm.”,”scene_note”:””,”visit_tip”:””,”access”:”public”,”access_label”:”Public”,”photo”:””,”lat”:31.6961000000000012732925824820995330810546875,”lng”:-9.8241999999999993775645634741522371768951416015625,”tags”:[“season-4″],”country_code”:”ma”,”country”:”Morocco”,”central”:false},{“id”:48,”name”:”Essaouira”,”address”:”Essaouira, Morocco”,”tagline”:”Port city where the Pogues explore the medina and wharf looking for Groff.”,”scene_note”:””,”visit_tip”:””,”access”:”public”,”access_label”:”Public”,”photo”:””,”lat”:31.508500000000001506350599811412394046783447265625,”lng”:-9.759499999999999175770426518283784389495849609375,”tags”:[“season-4″],”country_code”:”ma”,”country”:”Morocco”,”central”:false},{“id”:49,”name”:”Agapenta \/ The Blue Crown”,”address”:”Ouarzazate, Morocco”,”tagline”:”The door of the desert labyrinth where JJ ultimately finds the Blue Crown.”,”scene_note”:””,”visit_tip”:””,”access”:”public”,”access_label”:”Public”,”photo”:””,”lat”:30.91890000000000071622707764618098735809326171875,”lng”:-6.8933999999999997498889570124447345733642578125,”tags”:[“season-4″],”country_code”:”ma”,”country”:”Morocco”,”central”:false},{“id”:51,”name”:”Old Town Dubrovnik”,”address”:”Dubrovnik, Croatia”,”tagline”:”The UNESCO-protected Old Town served as the main base for several days of filming. Its narrow stone streets used for motorcycle chase and preserved medieval look make it suitable for different settings without major modifications.”,”scene_note”:””,”visit_tip”:””,”access”:”public”,”access_label”:”Public”,”photo”:””,”lat”:42.64030000000000342197381542064249515533447265625,”lng”:18.1082999999999998408384271897375583648681640625,”tags”:[“season-5″],”country_code”:”hr”,”country”:”Croatia”,”central”:false},{“id”:52,”name”:”Stradun”,”address”:”Stradun, Dubrovnik, Croatia”,”tagline”:”Dubrovnik\u2019s main promenade was closed during parts of the filming schedule. With its polished limestone pavement and historic fa\u00e7ades, Stradun offers a cinematic backdrop immediately recognizable to viewers.”,”scene_note”:””,”visit_tip”:””,”access”:”public”,”access_label”:”Public”,”photo”:””,”lat”:42.6409000000000020236257114447653293609619140625,”lng”:18.10900000000000176214598468504846096038818359375,”tags”:[“season-5″],”country_code”:”hr”,”country”:”Croatia”,”central”:false},{“id”:53,”name”:”Old Port (Porat)”,”address”:”Old Port, Dubrovnik, Croatia”,”tagline”:”The picturesque old harbor, framed by Saint John Fortress, was used for multiple scenes involving boats and waterfront action \u2014 a natural choice for a series deeply connected to boats and coastal life.”,”scene_note”:””,”visit_tip”:””,”access”:”public”,”access_label”:”Public”,”photo”:””,”lat”:42.640399999999999636202119290828704833984375,”lng”:18.111799999999998789235178264789283275604248046875,”tags”:[“season-5″],”country_code”:”hr”,”country”:”Croatia”,”central”:false},{“id”:54,”name”:”Lu\u017ea Square”,”address”:”Lu\u017ea Square, Dubrovnik, Croatia”,”tagline”:”One of the most iconic squares in Dubrovnik, located next to Sponza Palace and the Church of St. Blaise. A popular filming location thanks to its open layout and historical buildings.”,”scene_note”:””,”visit_tip”:””,”access”:”public”,”access_label”:”Public”,”photo”:””,”lat”:42.6407999999999987039700499735772609710693359375,”lng”:18.110600000000001585931386216543614864349365234375,”tags”:[“season-5″],”country_code”:”hr”,”country”:”Croatia”,”central”:false},{“id”:55,”name”:”Sponza Palace”,”address”:”Sponza Palace, Dubrovnik, Croatia”,”tagline”:”A striking 16th-century palace used in many international productions. The courtyard and fa\u00e7ade are ideal for scenes requiring historical ambience.”,”scene_note”:””,”visit_tip”:””,”access”:”public”,”access_label”:”Public”,”photo”:””,”lat”:42.6409000000000020236257114447653293609619140625,”lng”:18.11070000000000135287336888723075389862060546875,”tags”:[“season-5″],”country_code”:”hr”,”country”:”Croatia”,”central”:false},{“id”:56,”name”:”Jesuit Staircase”,”address”:”Jesuit Staircase, Dubrovnik, Croatia”,”tagline”:”One of the most famous staircases in Croatia, leading to the Church of St. Ignatius. Known worldwide from Game of Thrones, the stairs have once again become a star filming location.”,”scene_note”:””,”visit_tip”:””,”access”:”public”,”access_label”:”Public”,”photo”:””,”lat”:42.6390999999999991132426657713949680328369140625,”lng”:18.10940000000000082991391536779701709747314453125,”tags”:[“season-5″],”country_code”:”hr”,”country”:”Croatia”,”central”:false},{“id”:57,”name”:”Franciscan Monastery”,”address”:”Franciscan Monastery, Dubrovnik, Croatia”,”tagline”:”Located near Pile Gate, the monastery and its cloister provide a visually rich setting with impressive stone architecture.”,”scene_note”:””,”visit_tip”:””,”access”:”public”,”access_label”:”Public”,”photo”:””,”lat”:42.641300000000001091393642127513885498046875,”lng”:18.10770000000000123918653116561472415924072265625,”tags”:[“season-5″],”country_code”:”hr”,”country”:”Croatia”,”central”:false},{“id”:58,”name”:”Dan\u010de Beach”,”address”:”Dan\u010de Beach, Dubrovnik, Croatia”,”tagline”:”A rugged, rocky beach west of the Old Town. Dan\u010de is known for dramatic waves and cliffs \u2014 a perfect match for action-focused scenes.”,”scene_note”:””,”visit_tip”:””,”access”:”public”,”access_label”:”Public”,”photo”:””,”lat”:42.64059999999999917008608463220298290252685546875,”lng”:18.09909999999999996589394868351519107818603515625,”tags”:[“season-5″],”country_code”:”hr”,”country”:”Croatia”,”central”:false},{“id”:59,”name”:”Sesame Restaurant Area”,”address”:”Dante Alighierija, Dubrovnik, Croatia”,”tagline”:”The small park and pathways near Restaurant Sesame were used for part of the outdoor sequences.”,”scene_note”:””,”visit_tip”:””,”access”:”public”,”access_label”:”Public”,”photo”:””,”lat”:42.64269999999999782858139951713383197784423828125,”lng”:18.10379999999999967030817060731351375579833984375,”tags”:[“season-5″],”country_code”:”hr”,”country”:”Croatia”,”central”:false},{“id”:60,”name”:”Lapad Marina in Gru\u017e Harbour”,”address”:”Gru\u017e Harbour, Dubrovnik, Croatia”,”tagline”:”A modern marina area frequently used for logistics and filming involving boats. The contrast between historic Old Town and the Gru\u017e harbor gives the production diversity in visual style.”,”scene_note”:””,”visit_tip”:””,”access”:”public”,”access_label”:”Public”,”photo”:””,”lat”:42.65820000000000078443918027915060520172119140625,”lng”:18.084700000000001551825334900058805942535400390625,”tags”:[“season-5″],”country_code”:”hr”,”country”:”Croatia”,”central”:false},{“id”:61,”name”:”Sr\u0111 Mountain”,”address”:”Mount Sr\u0111, Dubrovnik, Croatia”,”tagline”:”The panoramic viewpoint above Dubrovnik, reachable by cable car, offers one of the best views in Croatia. A natural choice for wide establishing shots.”,”scene_note”:””,”visit_tip”:””,”access”:”public”,”access_label”:”Public”,”photo”:””,”lat”:42.6492999999999966576069709844887256622314453125,”lng”:18.111599999999999255351212923415005207061767578125,”tags”:[“season-5″],”country_code”:”hr”,”country”:”Croatia”,”central”:false},{“id”:62,”name”:”Lokrum Island”,”address”:”Lokrum Island, Dubrovnik, Croatia”,”tagline”:”Just 10 minutes from Old Town by boat, this lush nature reserve was used for several outdoor scenes. Lokrum\u2019s botanical gardens, rocky coastline, and monastery ruins are favorites among film crews.”,”scene_note”:””,”visit_tip”:””,”access”:”public”,”access_label”:”Public”,”photo”:””,”lat”:42.6287999999999982492226990871131420135498046875,”lng”:18.11970000000000169393388205207884311676025390625,”tags”:[“season-5″],”country_code”:”hr”,”country”:”Croatia”,”central”:false},{“id”:63,”name”:”Cavtat”,”address”:”Cavtat, Croatia”,”tagline”:”The charming coastal town south of Dubrovnik served as an additional filming location. Known for its waterfront promenade and old center, Cavtat provides a quieter but equally photogenic setting.”,”scene_note”:””,”visit_tip”:””,”access”:”public”,”access_label”:”Public”,”photo”:””,”lat”:42.58080000000000353566065314225852489471435546875,”lng”:18.219500000000000028421709430404007434844970703125,”tags”:[“season-5″],”country_code”:”hr”,”country”:”Croatia”,”central”:false}]
.won-filming-locations {
–won-fl-accent: #b9090b;
–won-fl-accent-hover: #9a0809;
–won-fl-bg: #ffffff;
–won-fl-surface: #fafafa;
–won-fl-border: #dcdcdc;
–won-fl-text: #221f1f;
–won-fl-muted: #666666;
–won-fl-star: #d4a017;
–won-fl-radius: 10px;
–won-fl-shadow: 0 4px 16px rgba(0, 0, 0, 0.08);
font-family: -apple-system, BlinkMacSystemFont, “Segoe UI”, Roboto, Helvetica, Arial, sans-serif;
width: 100%;
max-width: 100%;
margin: 1.5rem 0;
background: var(–won-fl-bg);
border: 1px solid var(–won-fl-border);
border-radius: var(–won-fl-radius);
box-shadow: var(–won-fl-shadow);
overflow: hidden;
color: var(–won-fl-text);
box-sizing: border-box;
}
.won-filming-locations *,
.won-filming-locations *::before,
.won-filming-locations *::after { box-sizing: border-box; }
.won-single–feature .won-filming-locations {
width: min(1120px, 96vw);
max-width: min(1120px, 96vw);
margin-left: calc(50% – min(560px, 48vw));
margin-right: 0;
}
.won-filming-locations–dark {
–won-fl-bg: #141414;
–won-fl-surface: #1a1a1a;
–won-fl-border: #2a2a2a;
–won-fl-text: #e8e8e8;
–won-fl-muted: #999999;
–won-fl-star: #f0c14b;
–won-fl-shadow: 0 4px 24px rgba(0, 0, 0, 0.4);
}
@media (prefers-color-scheme: dark) {
.won-filming-locations:not(.won-filming-locations–light) {
–won-fl-bg: #141414;
–won-fl-surface: #1a1a1a;
–won-fl-border: #2a2a2a;
–won-fl-text: #e8e8e8;
–won-fl-muted: #999999;
–won-fl-star: #f0c14b;
–won-fl-shadow: 0 4px 24px rgba(0, 0, 0, 0.4);
}
}
.won-fl-accent-bar { height: 3px; background: var(–won-fl-accent); }
.won-fl-header {
display: flex; align-items: flex-start; justify-content: space-between; gap: 1rem;
padding: 1.15rem 1.25rem 0.85rem;
}
.won-fl-heading { min-width: 0; }
.won-fl-title {
margin: 0; font-size: 1.2rem; font-weight: 700; line-height: 1.3;
color: var(–won-fl-text); font-family: inherit; letter-spacing: -0.02em; text-transform: none;
}
.won-fl-subtitle { margin: 0.2rem 0 0; font-size: 0.8rem; color: var(–won-fl-muted); }
.won-fl-tools {
display: flex; flex-direction: column; gap: 0.7rem;
padding: 0 1.25rem 1rem;
border-bottom: 1px solid var(–won-fl-border);
background: var(–won-fl-bg);
}
.won-fl-search {
position: relative; display: flex; align-items: center;
}
.won-fl-search-icon {
position: absolute; left: 0.75rem; display: flex; color: var(–won-fl-muted); pointer-events: none;
}
.won-fl-search-input {
width: 100%; appearance: none; -webkit-appearance: none;
border: 1px solid var(–won-fl-border); background: var(–won-fl-surface);
color: var(–won-fl-text); font-size: 0.9rem; font-family: inherit;
padding: 0.5rem 2.4rem 0.5rem 2.35rem; border-radius: 8px; min-height: 40px;
}
.won-fl-search-input:focus {
outline: none; border-color: var(–won-fl-accent);
box-shadow: 0 0 0 3px rgba(185, 9, 11, 0.12);
background: var(–won-fl-bg);
}
.won-fl-search-input::-webkit-search-cancel-button { display: none; }
.won-fl-search-clear {
appearance: none; position: absolute; right: 0.35rem;
width: 28px; height: 28px; border: 0; background: transparent;
color: var(–won-fl-muted); font-size: 1.2rem; line-height: 1;
border-radius: 6px; cursor: pointer; padding: 0;
}
.won-fl-search-clear:hover { color: var(–won-fl-text); background: var(–won-fl-border); }
.won-fl-filters-wrap { display: flex; flex-direction: column; gap: 0.45rem; }
.won-fl-filter-label {
flex: 0 0 4.4rem; font-size: 0.68rem; font-weight: 700; text-transform: uppercase;
letter-spacing: 0.06em; color: var(–won-fl-muted); line-height: 1;
}
.won-fl-filters {
display: flex; flex-wrap: wrap; align-items: center; gap: 0.35rem;
padding: 0;
}
.won-fl-filter {
appearance: none; border: 1px solid var(–won-fl-border); background: var(–won-fl-bg);
color: var(–won-fl-text); font-size: 0.75rem; font-weight: 600; padding: 0.28rem 0.7rem;
border-radius: 999px; cursor: pointer; min-height: 28px; line-height: 1.2;
}
.won-fl-filter:hover { border-color: var(–won-fl-accent); color: var(–won-fl-accent); }
.won-fl-filter.is-active,
.won-fl-filter.is-active:hover {
background: var(–won-fl-accent); border-color: var(–won-fl-accent); color: #fff;
}
.won-fl-list-item.is-filtered-out { display: none; }
.won-fl-body {
display: grid; grid-template-columns: minmax(0, 1.45fr) minmax(280px, 1fr);
gap: 0; min-height: 520px; background: var(–won-fl-surface);
}
.won-fl-map-wrap { position: relative; min-height: 520px; }
.won-fl-map { width: 100%; height: 100%; min-height: 520px; background: var(–won-fl-surface); z-index: 1; }
.won-fl-list {
list-style: none; margin: 0; padding: 0.75rem; overflow-y: auto; max-height: 520px;
display: flex; flex-direction: column; gap: 0.5rem;
border-left: 1px solid var(–won-fl-border); background: var(–won-fl-bg);
scrollbar-width: thin; scrollbar-color: var(–won-fl-accent) var(–won-fl-surface);
}
.won-fl-list-item {
display: flex; gap: 0.65rem; padding: 0.7rem; margin: 0;
border: 1px solid var(–won-fl-border); border-radius: 10px; background: var(–won-fl-surface);
cursor: pointer; transition: border-color 0.15s, box-shadow 0.15s, background 0.15s;
}
.won-fl-list-item:hover, .won-fl-list-item:focus {
border-color: var(–won-fl-accent); outline: none; background: var(–won-fl-bg);
}
.won-fl-list-item.is-active {
border-color: var(–won-fl-accent);
box-shadow: inset 3px 0 0 var(–won-fl-accent), 0 2px 10px rgba(185, 9, 11, 0.1);
background: var(–won-fl-bg);
}
.won-fl-list-badge {
flex-shrink: 0; width: 26px; height: 26px; display: flex; align-items: center; justify-content: center;
border-radius: 50%; background: var(–won-fl-accent); color: #fff; font-size: 0.72rem; font-weight: 700;
margin-top: 1px;
}
.won-fl-list-photo {
flex-shrink: 0; width: 56px; height: 56px; object-fit: cover; border-radius: 8px;
background: var(–won-fl-border);
}
.won-fl-list-content { display: flex; flex-direction: column; gap: 0.18rem; min-width: 0; flex: 1; }
.won-fl-list-name { font-size: 0.92rem; line-height: 1.3; color: var(–won-fl-text); }
.won-fl-star {
display: inline-block; color: var(–won-fl-star); font-size: 0.95em; line-height: 1;
margin-right: 0.15rem; vertical-align: baseline;
}
.won-fl-central-label {
display: inline-block; width: fit-content; font-size: 0.65rem; font-weight: 700;
letter-spacing: 0.04em; text-transform: uppercase; color: var(–won-fl-star);
}
.won-fl-access {
display: inline-block; width: fit-content; font-size: 0.65rem; font-weight: 700;
letter-spacing: 0.04em; text-transform: uppercase; color: var(–won-fl-muted);
}
.won-fl-access–private,
.won-fl-access–view-from-street { color: var(–won-fl-accent); }
.won-fl-list-address, .won-fl-list-tagline, .won-fl-list-scene, .won-fl-list-tip, .won-fl-walk-next {
font-size: 0.78rem; color: var(–won-fl-muted); line-height: 1.35;
}
.won-fl-list-address {
overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.won-fl-list-tagline { font-style: italic; }
.won-fl-list-scene,
.won-fl-list-tip,
.won-fl-list-actions { display: none; }
.won-fl-list-item.is-active .won-fl-list-scene,
.won-fl-list-item.is-active .won-fl-list-tip { display: block; }
.won-fl-list-item.is-active .won-fl-list-actions { display: flex; }
.won-fl-list-item.is-active .won-fl-list-address { white-space: normal; }
.won-fl-list-tip { font-weight: 600; }
.won-fl-walk-next { color: var(–won-fl-accent); font-weight: 600; }
.won-fl-list-actions {
flex-wrap: wrap; gap: 0.15rem 0.85rem; margin-top: 0.4rem;
padding-top: 0.45rem; border-top: 1px solid var(–won-fl-border);
}
.won-fl-directions, .won-fl-streetview, .won-fl-share {
display: inline-block; font-size: 0.75rem; font-weight: 600;
color: var(–won-fl-accent); text-decoration: none; background: none; border: 0;
padding: 0; cursor: pointer; font-family: inherit;
}
.won-fl-directions:hover, .won-fl-streetview:hover, .won-fl-share:hover { text-decoration: underline; }
.won-fl-empty {
list-style: none; margin: auto 0; padding: 2rem 0.75rem; text-align: center;
font-size: 0.9rem; color: var(–won-fl-muted); border: 0; background: transparent;
}
.won-fl-empty[hidden] { display: none; }
.won-fl-footer {
border-top: 1px solid var(–won-fl-border); background: var(–won-fl-bg);
}
.won-fl-progress {
height: 3px; background: var(–won-fl-border); margin: 0; overflow: hidden;
}
.won-fl-progress-bar {
display: block; height: 100%; width: 0; background: var(–won-fl-accent);
transition: width 0.2s ease;
}
.won-fl-controls {
display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 0.65rem 1rem;
padding: 0.7rem 1.25rem;
}
.won-fl-nav,
.won-fl-footer-actions { display: flex; flex-wrap: wrap; align-items: center; gap: 0.4rem; }
.won-fl-btn {
appearance: none; border: 1px solid var(–won-fl-border); background: var(–won-fl-bg);
color: var(–won-fl-text); font-size: 0.8rem; font-weight: 600; padding: 0.4rem 0.8rem;
border-radius: 7px; cursor: pointer; min-height: 34px; font-family: inherit;
}
.won-fl-btn:hover { border-color: var(–won-fl-accent); color: var(–won-fl-accent); }
.won-fl-btn:disabled { opacity: 0.4; cursor: default; border-color: var(–won-fl-border); color: var(–won-fl-muted); }
.won-fl-btn–tour {
background: var(–won-fl-accent); border-color: var(–won-fl-accent); color: #fff;
}
.won-fl-btn–tour:hover {
background: var(–won-fl-accent-hover); border-color: var(–won-fl-accent-hover); color: #fff;
}
.won-fl-btn–route.is-active {
border-color: var(–won-fl-accent); color: var(–won-fl-accent);
background: var(–won-fl-surface);
}
.won-fl-btn–all { margin-left: 0; }
.won-fl-counter {
min-width: 3.6rem; text-align: center; font-size: 0.8rem; font-weight: 700;
font-variant-numeric: tabular-nums; color: var(–won-fl-text);
}
.won-fl-counter-sep { color: var(–won-fl-muted); font-weight: 500; padding: 0 0.1rem; }
.won-fl-marker-pin {
width: 32px; height: 32px; border-radius: 50% 50% 50% 0; background: var(–won-fl-accent);
color: #fff; font-size: 0.85rem; font-weight: 700; display: flex; align-items: center; justify-content: center;
transform: rotate(-45deg); box-shadow: 0 2px 6px rgba(0, 0, 0, 0.35); border: 2px solid #fff;
}
.won-fl-marker-pin span { transform: rotate(45deg); }
.won-fl-marker-star {
width: 36px; height: 36px; border-radius: 50%; background: var(–won-fl-star);
color: #fff; display: flex; align-items: center; justify-content: center;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.35); border: 2px solid #fff;
}
.won-fl-marker-star svg { display: block; }
.won-fl-popup .leaflet-popup-content { margin: 0.75rem 0.9rem; min-width: 180px; }
.won-fl-popup strong { display: block; margin-bottom: 0.25rem; }
.won-fl-popup-photo { width: 100%; max-height: 110px; object-fit: cover; border-radius: 4px; margin-bottom: 0.4rem; display: block; }
.won-fl-popup-central {
display: block; font-size: 0.72rem; font-weight: 700; letter-spacing: 0.04em;
text-transform: uppercase; color: #b8860b; margin-bottom: 0.25rem;
}
.won-fl-popup-tag { display: block; font-size: 0.8rem; font-style: italic; color: #666; margin-bottom: 0.25rem; }
.won-fl-popup-scene, .won-fl-popup-tip { display: block; font-size: 0.78rem; color: #444; margin: 0.25rem 0; }
.won-fl-popup-links { display: flex; flex-wrap: wrap; gap: 0.6rem; margin-top: 0.4rem; }
.won-fl-popup-links a { font-size: 0.78rem; font-weight: 600; color: #b9090b; text-decoration: none; }
.won-fl-popup small { color: #666; }
.won-fl-marker.leaflet-div-icon {
background: none; border: 0;
}
.won-fl-error { color: #b9090b; font-weight: 600; }
@media (max-width: 768px) {
.won-fl-header, .won-fl-tools { padding-left: 1rem; padding-right: 1rem; }
.won-fl-body { grid-template-columns: 1fr; min-height: 0; }
.won-fl-map-wrap, .won-fl-map { min-height: 280px; }
.won-fl-list { border-left: 0; border-top: 1px solid var(–won-fl-border); max-height: 360px; }
.won-fl-controls { padding: 0.7rem 1rem; }
.won-fl-nav, .won-fl-footer-actions { width: 100%; }
.won-fl-footer-actions { justify-content: stretch; }
.won-fl-footer-actions .won-fl-btn { flex: 1; }
.won-fl-filter-label { flex-basis: 100%; margin-bottom: 0.1rem; }
}
@media print {
.won-fl-accent-bar,
.won-fl-tools,
.won-fl-footer,
.won-fl-map-wrap,
.won-fl-list-photo,
.won-fl-list-actions,
.won-fl-walk-next { display: none !important; }
.won-filming-locations {
box-shadow: none; border: 0; background: #fff; color: #111;
overflow: visible; max-width: 100%; margin: 0;
}
.won-fl-header { padding: 0 0 1rem; border: 0; }
.won-fl-body { display: block; min-height: 0; background: #fff; }
.won-fl-list {
max-height: none; overflow: visible; border: 0; padding: 0;
background: #fff; display: block;
}
.won-fl-list-item.is-filtered-out { display: none !important; }
.won-fl-list-item {
break-inside: avoid; box-shadow: none; cursor: default;
border: 1px solid #ccc; background: #fff; color: #111;
margin-bottom: 0.5rem;
}
.won-fl-list-scene,
.won-fl-list-tip { display: block !important; }
.won-fl-title, .won-fl-list-name, .won-fl-list-address, .won-fl-list-tagline,
.won-fl-list-scene, .won-fl-list-tip, .won-fl-access, .won-fl-subtitle {
color: #111;
}
.won-fl-star, .won-fl-central-label { color: #b8860b; }
}
(function () {
var containerId = “won-fl-2-1″;
var dataId = containerId + ‘-data’;
function initFilmingLocations() {
if (typeof L === ‘undefined’) {
setTimeout(initFilmingLocations, 50);
return;
}
var container = document.getElementById(containerId);
var dataEl = document.getElementById(dataId);
if (!container || !dataEl) return;
var allStops;
try { allStops = JSON.parse(dataEl.textContent || ‘[]’); } catch (e) { return; }
if (!allStops.length) return;
var zoomStart = parseInt(container.getAttribute(‘data-zoom-start’) || ’13’, 10) || 13;
var mapEl = container.querySelector(‘.won-fl-map’);
var prevBtn = container.querySelector(‘.won-fl-btn–prev’);
var nextBtn = container.querySelector(‘.won-fl-btn–next’);
var allBtn = container.querySelector(‘.won-fl-btn–all’);
var tourBtn = container.querySelector(‘.won-fl-btn–tour’);
var routeBtn = container.querySelector(‘.won-fl-btn–route’);
var printBtn = container.querySelector(‘.won-fl-btn–print’);
var counterCurrentEl = container.querySelector(‘.won-fl-counter-current’);
var counterTotalEl = container.querySelector(‘.won-fl-counter-total’);
var subtitleEl = container.querySelector(‘.won-fl-subtitle’);
var progressBar = container.querySelector(‘.won-fl-progress-bar’);
var listItems = container.querySelectorAll(‘.won-fl-list-item’);
var tagBtns = container.querySelectorAll(‘.won-fl-filters–tags .won-fl-filter’);
var countryBtns = container.querySelectorAll(‘.won-fl-filters–countries .won-fl-filter’);
var searchInput = container.querySelector(‘.won-fl-search-input’);
var searchClear = container.querySelector(‘.won-fl-search-clear’);
var emptyEl = container.querySelector(‘.won-fl-empty’);
var labelOne = container.getAttribute(‘data-label-one’) || ‘%d filming location’;
var labelMany = container.getAttribute(‘data-label-many’) || ‘%d filming locations’;
var labelWalk = container.getAttribute(‘data-label-walk’) || ‘%d min walk to next’;
var labelRouteShow = container.getAttribute(‘data-label-route-show’) || ‘Show route’;
var labelRouteHide = container.getAttribute(‘data-label-route-hide’) || ‘Hide route’;
var labelCentral = container.getAttribute(‘data-label-central’) || ‘Central filming location’;
var labelCopied = container.getAttribute(‘data-label-copied’) || ‘Copied’;
var labelShare = container.getAttribute(‘data-label-share’) || ‘Share stop’;
var labelDirections = container.getAttribute(‘data-label-directions’) || ‘Directions’;
var labelStreetView = container.getAttribute(‘data-label-streetview’) || ‘Street View’;
var showAccess = container.getAttribute(‘data-show-access’) === ‘1’;
var labelTip = container.getAttribute(‘data-label-tip’) || ‘Tip’;
var printTitle = container.getAttribute(‘data-print-title’) || ”;
var selectedTags = (container.getAttribute(‘data-initial-tags’) || ”)
.split(‘,’)
.map(function (t) { return t.trim(); })
.filter(Boolean);
var selectedCountries = [];
var searchQuery = ”;
var searchTokens = [];
var searchTimer = null;
var searchHaystacks = allStops.map(function (stop) {
var parts = [
stop.name, stop.address, stop.tagline, stop.scene_note,
stop.visit_tip, stop.country, stop.country_code
];
if (stop.tags && stop.tags.length) parts.push(stop.tags.join(‘ ‘));
return String(parts.join(‘ ‘)).toLowerCase().replace(/\s+/g, ‘ ‘).trim();
});
var visibleIndices = [];
var currentVisiblePos = 0;
var markers = [];
var markerGroup = L.layerGroup();
var focusZoom = Math.max(zoomStart, 13);
var skipHashWrite = false;
var showRoute = false;
var map = L.map(mapEl, { scrollWheelZoom: false, preferCanvas: true });
L.tileLayer(‘https://{s}.basemaps.cartocdn.com/light_all/{z}/{x}/{y}{r}.png’, {
maxZoom: 20,
subdomains: ‘abcd’,
attribution: ‘© OpenStreetMap contributors © CARTO’
}).addTo(map);
markerGroup.addTo(map);
var routeLine = L.polyline([], {
color: ‘#b9090b’,
weight: 3,
opacity: 0.45,
dashArray: ‘6 8’
}).addTo(map);
function stopMatches(stop, idx) {
if (selectedTags.length) {
var stopTags = stop.tags || [];
var tagOk = false;
for (var i = 0; i < selectedTags.length; i++) {
if (stopTags.indexOf(selectedTags[i]) !== -1) {
tagOk = true;
break;
}
}
if (!tagOk) return false;
}
if (selectedCountries.length) {
var code = stop.country_code || '';
if (selectedCountries.indexOf(code) === -1) return false;
}
if (searchTokens.length) {
var hay = searchHaystacks[idx] || '';
for (var t = 0; t 0 ? ((pos + 1) / total) * 100 : 0;
progressBar.style.width = pct + ‘%’;
}
function haversineMeters(a, b) {
var r = 6371000;
var toRad = Math.PI / 180;
var dLat = (b.lat – a.lat) * toRad;
var dLng = (b.lng – a.lng) * toRad;
var lat1 = a.lat * toRad;
var lat2 = b.lat * toRad;
var h = Math.sin(dLat / 2) * Math.sin(dLat / 2) +
Math.cos(lat1) * Math.cos(lat2) * Math.sin(dLng / 2) * Math.sin(dLng / 2);
return 2 * r * Math.asin(Math.min(1, Math.sqrt(h)));
}
function updateWalkTimes(activeOrigIdx) {
listItems.forEach(function (item) {
var el = item.querySelector(‘.won-fl-walk-next’);
if (!el) return;
el.hidden = true;
el.textContent=””;
});
if (currentVisiblePos >= visibleIndices.length – 1) return;
var here = allStops[activeOrigIdx];
var next = allStops[visibleIndices[currentVisiblePos + 1]];
if (!here || !next) return;
var meters = haversineMeters(here, next);
var mins = Math.max(1, Math.round(meters / 83.33));
var activeItem = listItems[activeOrigIdx];
var walkEl = activeItem ? activeItem.querySelector(‘.won-fl-walk-next’) : null;
if (walkEl) {
walkEl.hidden = false;
walkEl.textContent = labelWalk.replace(‘%d’, String(mins));
}
}
function googleTourUrl(locs) {
if (!locs.length) return ”;
var parts = locs.map(function (loc) { return loc.lat + ‘,’ + loc.lng; });
return ‘https://www.google.com/maps/dir/’ + parts.map(encodeURIComponent).join(‘/’);
}
function fitAllStops() {
var locs = visibleStops();
if (!locs.length) return;
var latlngs = locs.map(function (loc) { return [loc.lat, loc.lng]; });
map.closePopup();
map.fitBounds(L.latLngBounds(latlngs), { padding: [50, 50], maxZoom: zoomStart });
}
function renderRoute() {
if (!showRoute) {
routeLine.setLatLngs([]);
return;
}
var latlngs = visibleStops().map(function (loc) { return [loc.lat, loc.lng]; });
routeLine.setLatLngs(latlngs);
}
function syncRouteButton() {
if (!routeBtn) return;
routeBtn.textContent = showRoute ? labelRouteHide : labelRouteShow;
routeBtn.setAttribute(‘aria-pressed’, showRoute ? ‘true’ : ‘false’);
routeBtn.classList.toggle(‘is-active’, showRoute);
}
function escapeHtml(str) {
return String(str == null ? ” : str)
.replace(/&/g, ‘&’)
.replace(//g, ‘>’)
.replace(/”/g, ‘"’);
}
function popupHtml(loc) {
var html=””;
if (loc.photo) html += ‘‘;
html += ‘‘ + escapeHtml(loc.name) + ‘‘;
if (loc.central) html += ‘‘ + escapeHtml(labelCentral) + ‘‘;
if (showAccess && loc.access_label) html += ‘‘ + escapeHtml(loc.access_label) + ‘‘;
if (loc.tagline) html += ‘‘ + escapeHtml(loc.tagline) + ‘‘;
if (loc.scene_note) html += ‘‘ + escapeHtml(loc.scene_note) + ‘‘;
if (loc.visit_tip) html += ‘‘ + escapeHtml(loc.visit_tip) + ‘‘;
if (loc.address) html += ‘‘ + escapeHtml(loc.address) + ‘‘;
html += ‘
html += ” + escapeHtml(labelDirections) + ”;
html += ” + escapeHtml(labelStreetView) + ”;
html += ‘
‘;
return html;
}
function renderMarkers() {
markerGroup.clearLayers();
markers = [];
visibleIndices.forEach(function (origIdx, visIdx) {
var loc = allStops[origIdx];
var icon;
if (loc.central) {
icon = L.divIcon({
className: ‘won-fl-marker won-fl-marker–central’,
html: ‘
‘,
iconSize: [36, 36],
iconAnchor: [18, 18],
popupAnchor: [0, -18]
});
} else {
icon = L.divIcon({
className: ‘won-fl-marker’,
html: ‘
‘,
iconSize: [32, 32],
iconAnchor: [16, 32],
popupAnchor: [0, -32]
});
}
var marker = L.marker([loc.lat, loc.lng], { icon: icon, zIndexOffset: loc.central ? 1000 : 0 });
marker.bindPopup(popupHtml(loc), { className: ‘won-fl-popup’, autoPan: false });
marker.on(‘click’, function () { updateTour(visIdx); });
marker.addTo(markerGroup);
markers.push(marker);
});
}
function writeStopHash(stopId) {
if (skipHashWrite || !stopId) return;
if (typeof history !== ‘undefined’ && history.replaceState) {
history.replaceState(null, ”, ‘#’ + ‘stop-‘ + stopId);
}
}
function updateTour(visiblePos, skipMapMove) {
if (!visibleIndices.length) {
if (counterCurrentEl) counterCurrentEl.textContent=”0″;
if (prevBtn) prevBtn.disabled = true;
if (nextBtn) nextBtn.disabled = true;
if (tourBtn) tourBtn.disabled = true;
if (printBtn) printBtn.disabled = true;
setProgress(0, 0);
listItems.forEach(function (item) {
item.classList.remove(‘is-active’);
item.setAttribute(‘aria-pressed’, ‘false’);
});
return;
}
if (tourBtn) tourBtn.disabled = false;
if (printBtn) printBtn.disabled = false;
currentVisiblePos = Math.max(0, Math.min(visibleIndices.length – 1, visiblePos));
var origIdx = visibleIndices[currentVisiblePos];
var loc = allStops[origIdx];
if (counterCurrentEl) counterCurrentEl.textContent = String(currentVisiblePos + 1);
setProgress(currentVisiblePos, visibleIndices.length);
listItems.forEach(function (item, idx) {
var isActive = idx === origIdx;
item.classList.toggle(‘is-active’, isActive);
item.setAttribute(‘aria-pressed’, isActive ? ‘true’ : ‘false’);
});
updateWalkTimes(origIdx);
if (loc && loc.id) writeStopHash(loc.id);
if (prevBtn) prevBtn.disabled = currentVisiblePos === 0;
if (nextBtn) nextBtn.disabled = currentVisiblePos === visibleIndices.length – 1;
if (skipMapMove) {
markers.forEach(function (m) { m.closePopup(); });
return;
}
map.setView([loc.lat, loc.lng], focusZoom, { animate: true });
markers.forEach(function (m, idx) {
if (idx === currentVisiblePos) m.openPopup();
else m.closePopup();
});
var activeItem = listItems[origIdx];
if (activeItem && typeof activeItem.scrollIntoView === ‘function’) {
activeItem.scrollIntoView({ behavior: ‘smooth’, block: ‘nearest’ });
}
}
function syncFilterButtons() {
tagBtns.forEach(function (btn) {
var tag = btn.getAttribute(‘data-tag’) || ”;
var isAll = tag === ”;
var active = isAll ? selectedTags.length === 0 : selectedTags.indexOf(tag) !== -1;
btn.classList.toggle(‘is-active’, active);
btn.setAttribute(‘aria-pressed’, active ? ‘true’ : ‘false’);
});
countryBtns.forEach(function (btn) {
var code = btn.getAttribute(‘data-country’) || ”;
var isAll = code === ”;
var active = isAll ? selectedCountries.length === 0 : selectedCountries.indexOf(code) !== -1;
btn.classList.toggle(‘is-active’, active);
btn.setAttribute(‘aria-pressed’, active ? ‘true’ : ‘false’);
});
}
function applyFilter(preferredOrigIdx) {
visibleIndices = [];
allStops.forEach(function (stop, idx) {
if (stopMatches(stop, idx)) visibleIndices.push(idx);
});
listItems.forEach(function (item, idx) {
var show = visibleIndices.indexOf(idx) !== -1;
item.classList.toggle(‘is-filtered-out’, !show);
item.tabIndex = show ? 0 : -1;
if (show) {
var visIdx = visibleIndices.indexOf(idx);
var badge = item.querySelector(‘.won-fl-list-badge’);
if (badge) badge.textContent = String(visIdx + 1);
}
});
if (emptyEl) emptyEl.hidden = visibleIndices.length > 0;
setCount(visibleIndices.length);
syncFilterButtons();
renderMarkers();
renderRoute();
var startPos = 0;
if (typeof preferredOrigIdx === ‘number’) {
var found = visibleIndices.indexOf(preferredOrigIdx);
if (found !== -1) startPos = found;
}
updateTour(startPos, true);
if (visibleIndices.length) {
setTimeout(function () {
map.invalidateSize();
fitAllStops();
}, 50);
} else {
map.closePopup();
}
}
function stopIndexById(id) {
for (var i = 0; i < allStops.length; i++) {
if (String(allStops[i].id) === String(id)) return i;
}
return -1;
}
function hashStopId() {
var hash = (window.location.hash || '').replace(/^#/, '');
var match = hash.match(/^stop-(\d+)$/);
return match ? match[1] : '';
}
function applyHashStop() {
var id = hashStopId();
if (!id) return;
var origIdx = stopIndexById(id);
if (origIdx < 0) return;
if (visibleIndices.indexOf(origIdx) === -1) {
selectedTags = [];
selectedCountries = [];
searchQuery = '';
searchTokens = [];
if (searchInput) searchInput.value = '';
if (searchClear) searchClear.hidden = true;
skipHashWrite = true;
applyFilter(origIdx);
skipHashWrite = false;
var visPos = visibleIndices.indexOf(origIdx);
if (visPos !== -1) updateTour(visPos);
return;
}
updateTour(visibleIndices.indexOf(origIdx));
}
listItems.forEach(function (item) {
var origIdx = parseInt(item.getAttribute('data-stop'), 10);
item.addEventListener('click', function () {
var visPos = visibleIndices.indexOf(origIdx);
if (visPos !== -1) updateTour(visPos);
});
item.addEventListener('keydown', function (e) {
if (e.key === 'Enter' || e.key === ' ') {
e.preventDefault();
var visPos = visibleIndices.indexOf(origIdx);
if (visPos !== -1) updateTour(visPos);
}
});
});
if (prevBtn) prevBtn.addEventListener('click', function () { updateTour(currentVisiblePos – 1); });
if (nextBtn) nextBtn.addEventListener('click', function () { updateTour(currentVisiblePos + 1); });
if (allBtn) allBtn.addEventListener('click', fitAllStops);
if (routeBtn) {
routeBtn.addEventListener('click', function () {
showRoute = !showRoute;
syncRouteButton();
renderRoute();
});
}
if (tourBtn) {
tourBtn.addEventListener('click', function () {
var url = googleTourUrl(visibleStops());
if (url) window.open(url, '_blank', 'noopener,noreferrer');
});
}
if (printBtn) {
printBtn.addEventListener('click', function () {
var locs = visibleStops();
if (!locs.length) return;
var countTmpl = locs.length === 1 ? labelOne : labelMany;
var rows = locs.map(function (loc, i) {
var html = '
html += ‘
‘ + (i + 1) + ‘. ‘ + (loc.central ? ‘★ ‘ : ”) + escapeHtml(loc.name) + ‘
‘;
if (loc.central) html += ‘
‘;
if (showAccess && loc.access_label) html += ‘
‘;
if (loc.address) html += ‘
‘ + escapeHtml(loc.address) + ‘
‘;
if (loc.tagline) html += ‘
‘ + escapeHtml(loc.tagline) + ‘
‘;
if (loc.scene_note) html += ‘
‘ + escapeHtml(loc.scene_note) + ‘
‘;
if (loc.visit_tip) html += ‘
‘ + escapeHtml(labelTip) + ‘: ‘ + escapeHtml(loc.visit_tip) + ‘
‘;
html += ‘
‘ + escapeHtml(loc.lat + ‘, ‘ + loc.lng) + ‘
‘;
html += ‘
‘;
return html;
}).join(”);
var doc=”
doc += ”;
doc += ‘body{font-family:-apple-system,BlinkMacSystemFont,”Segoe UI”,Roboto,Helvetica,Arial,sans-serif;color:#111;max-width:720px;margin:1.5rem auto;padding:0 1rem;}’;
doc += ‘h1{font-size:1.4rem;margin:0 0 .25rem;}’;
doc += ‘.sub{color:#555;margin:0 0 1.25rem;font-size:.95rem;}’;
doc += ‘.stop{display:flex;gap:.75rem;border-bottom:1px solid #ddd;padding:.85rem 0;break-inside:avoid;}’;
doc += ‘.tick{flex:0 0 18px;width:18px;height:18px;border:1.5px solid #333;margin-top:.2rem;}’;
doc += ‘.name{font-weight:700;margin:0 0 .2rem;font-size:1.05rem;}’;
doc += ‘p{margin:0 0 .2rem;font-size:.9rem;line-height:1.4;}’;
doc += ‘.meta{text-transform:uppercase;letter-spacing:.03em;font-size:.7rem;font-weight:700;color:#555;}’;
doc += ‘.tagline{font-style:italic;color:#444;}’;
doc += ‘.coords{color:#666;font-size:.8rem;}’;
doc += ‘@media print{body{margin:0;}}’;
doc += ”;
doc += ‘
‘ + escapeHtml(printTitle) + ‘
‘;
doc += ‘
‘ + escapeHtml(countTmpl.replace(‘%d’, String(locs.length))) + ‘
‘;
doc += rows + ”;
var win = window.open(”, ‘_blank’);
if (!win) {
window.print();
return;
}
win.document.open();
win.document.write(doc);
win.document.close();
win.focus();
setTimeout(function () {
win.print();
}, 250);
});
}
container.querySelectorAll(‘.won-fl-share’).forEach(function (btn) {
btn.addEventListener(‘click’, function (e) {
e.preventDefault();
e.stopPropagation();
var id = btn.getAttribute(‘data-stop-id’) || ”;
if (!id) return;
var url = window.location.href.split(‘#’)[0] + ‘#stop-‘ + id;
if (navigator.clipboard && navigator.clipboard.writeText) {
navigator.clipboard.writeText(url).then(function () {
btn.textContent = labelCopied;
setTimeout(function () { btn.textContent = labelShare; }, 1500);
});
}
});
});
function setSearch(raw) {
searchQuery = String(raw || ”).toLowerCase().replace(/\s+/g, ‘ ‘).trim();
searchTokens = searchQuery ? searchQuery.split(‘ ‘).filter(Boolean) : [];
if (searchClear) searchClear.hidden = searchQuery === ”;
}
if (searchInput) {
searchInput.addEventListener(‘input’, function () {
setSearch(searchInput.value);
clearTimeout(searchTimer);
searchTimer = setTimeout(function () { applyFilter(); }, 120);
});
searchInput.addEventListener(‘keydown’, function (e) {
if (e.key === ‘Escape’ && searchInput.value) {
e.preventDefault();
searchInput.value=””;
setSearch(”);
applyFilter();
}
});
}
if (searchClear) {
searchClear.addEventListener(‘click’, function () {
if (searchInput) searchInput.value=””;
setSearch(”);
applyFilter();
if (searchInput) searchInput.focus();
});
}
tagBtns.forEach(function (btn) {
btn.addEventListener(‘click’, function () {
var tag = btn.getAttribute(‘data-tag’) || ”;
if (tag === ”) {
selectedTags = [];
} else {
var pos = selectedTags.indexOf(tag);
if (pos === -1) selectedTags.push(tag);
else selectedTags.splice(pos, 1);
}
applyFilter();
});
});
countryBtns.forEach(function (btn) {
btn.addEventListener(‘click’, function () {
var code = btn.getAttribute(‘data-country’) || ”;
if (code === ”) {
selectedCountries = [];
} else {
var pos = selectedCountries.indexOf(code);
if (pos === -1) selectedCountries.push(code);
else selectedCountries.splice(pos, 1);
}
applyFilter();
});
});
window.addEventListener(‘hashchange’, applyHashStop);
setTimeout(function () {
map.invalidateSize();
skipHashWrite = true;
applyFilter();
skipHashWrite = false;
applyHashStop();
}, 100);
}
if (document.readyState === ‘loading’) {
document.addEventListener(‘DOMContentLoaded’, initFilmingLocations);
} else {
initFilmingLocations();
}
})();
Sources used for this article: Netflix TUDUM, Lively Charleston, Dubrovinik Tourist Guides, Collider, TimeOut
