@treely/strapi-slices 7.12.0 → 7.13.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (29) hide show
  1. package/dist/__mocks__/mapbox-gl.d.ts +11 -2
  2. package/dist/integrations/strapi/getFpmProjectsByBbox.d.ts +3 -0
  3. package/dist/integrations/strapi/getStrapiProjects.d.ts +3 -0
  4. package/dist/models/fpm/FPMProject.d.ts +3 -0
  5. package/dist/slices/ProjectsMap/ProjectsMap.d.ts +1 -2
  6. package/dist/strapi-slices.cjs.development.js +564 -182
  7. package/dist/strapi-slices.cjs.development.js.map +1 -1
  8. package/dist/strapi-slices.cjs.production.min.js +1 -1
  9. package/dist/strapi-slices.cjs.production.min.js.map +1 -1
  10. package/dist/strapi-slices.esm.js +626 -245
  11. package/dist/strapi-slices.esm.js.map +1 -1
  12. package/dist/utils/mergeProjectData.d.ts +4 -0
  13. package/package.json +2 -1
  14. package/src/components/SliceRenderer/SliceRenderer.tsx +0 -1
  15. package/src/integrations/strapi/getFpmProjectsByBbox.test.ts +115 -0
  16. package/src/integrations/strapi/getFpmProjectsByBbox.ts +24 -0
  17. package/src/integrations/strapi/getPortfolioProjects.ts +5 -46
  18. package/src/integrations/strapi/getStrapiProjects.test.ts +167 -0
  19. package/src/integrations/strapi/getStrapiProjects.ts +57 -0
  20. package/src/models/fpm/FPMProject.ts +3 -0
  21. package/src/slices/ProjectsMap/ProjectsMap.stories.tsx +0 -48
  22. package/src/slices/ProjectsMap/ProjectsMap.test.tsx +111 -39
  23. package/src/slices/ProjectsMap/ProjectsMap.tsx +517 -91
  24. package/src/slices/TextWithCard/TextWithCard.stories.tsx +1 -0
  25. package/src/test/integrationMocks/fpmProjectMock.ts +1 -0
  26. package/src/utils/mergeProjectData.ts +34 -0
  27. package/dist/slices/ProjectsMap/MapMarker.d.ts +0 -12
  28. package/src/slices/ProjectsMap/MapMarker.test.tsx +0 -101
  29. package/src/slices/ProjectsMap/MapMarker.tsx +0 -102
@@ -8,7 +8,7 @@ var axiosCacheInterceptor = require('axios-cache-interceptor');
8
8
  var React = require('react');
9
9
  var boemly = require('boemly');
10
10
  var Head = require('next/head');
11
- var Image = require('next/image');
11
+ var Image$1 = require('next/image');
12
12
  var reactUse = require('react-use');
13
13
  var react = require('@phosphor-icons/react');
14
14
  var Link = require('next/link');
@@ -20,7 +20,7 @@ var router = require('next/router');
20
20
  var styled = require('@emotion/styled');
21
21
  var framerMotion = require('framer-motion');
22
22
  var mapboxgl = require('mapbox-gl');
23
- var client = require('react-dom/client');
23
+ var debounce = require('lodash/debounce');
24
24
  var formik = require('formik');
25
25
  var useEmblaCarousel = require('embla-carousel-react');
26
26
  var AutoScroll = require('embla-carousel-auto-scroll');
@@ -32,10 +32,11 @@ var axios__default = /*#__PURE__*/_interopDefault(axios);
32
32
  var qs__default = /*#__PURE__*/_interopDefault(qs);
33
33
  var React__default = /*#__PURE__*/_interopDefault(React);
34
34
  var Head__default = /*#__PURE__*/_interopDefault(Head);
35
- var Image__default = /*#__PURE__*/_interopDefault(Image);
35
+ var Image__default = /*#__PURE__*/_interopDefault(Image$1);
36
36
  var Link__default = /*#__PURE__*/_interopDefault(Link);
37
37
  var styled__default = /*#__PURE__*/_interopDefault(styled);
38
38
  var mapboxgl__default = /*#__PURE__*/_interopDefault(mapboxgl);
39
+ var debounce__default = /*#__PURE__*/_interopDefault(debounce);
39
40
  var useEmblaCarousel__default = /*#__PURE__*/_interopDefault(useEmblaCarousel);
40
41
  var AutoScroll__default = /*#__PURE__*/_interopDefault(AutoScroll);
41
42
  var useSWRInfinite__default = /*#__PURE__*/_interopDefault(useSWRInfinite);
@@ -488,49 +489,92 @@ var fpmClient = /*#__PURE__*/axiosCacheInterceptor.setupCache(/*#__PURE__*/axios
488
489
  });
489
490
 
490
491
  var FALLBACK_LOCALE = 'en';
491
- var getPortfolioProjects = /*#__PURE__*/function () {
492
- var _ref = /*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee(locale, preview) {
493
- var cache, params, _yield$Promise$all, fpmProjects, strapiProjectsLocalized, strapiProjectsEnglish, strapiProjects, _i, _arr, project;
492
+ var getStrapiProjects = /*#__PURE__*/function () {
493
+ var _ref = /*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee(locale, pLevel, preview) {
494
+ var cache, strapiParams, strapiProjects, _yield$Promise$all, strapiProjectsLocalized, strapiProjectsEnglish, _i, _arr, project;
494
495
  return _regeneratorRuntime().wrap(function _callee$(_context) {
495
496
  while (1) switch (_context.prev = _context.next) {
496
497
  case 0:
497
498
  if (locale === void 0) {
498
499
  locale = 'en';
499
500
  }
501
+ if (pLevel === void 0) {
502
+ pLevel = STRAPI_DEFAULT_POPULATE_DEPTH;
503
+ }
500
504
  if (preview === void 0) {
501
505
  preview = false;
502
506
  }
503
507
  cache = preview ? false : undefined;
504
- params = {
505
- pLevel: STRAPI_DEFAULT_POPULATE_DEPTH,
508
+ strapiParams = {
509
+ pLevel: pLevel,
506
510
  locale: locale,
507
511
  'pagination[pageSize]': STRAPI_DEFAULT_PAGE_SIZE,
508
512
  status: preview ? 'draft' : 'published'
509
513
  };
510
- _context.next = 6;
511
- return Promise.all([fpmClient.get('/public/projects', {
512
- cache: cache
513
- }), strapiClient.get('/projects', {
514
- params: params,
514
+ strapiProjects = new Map();
515
+ _context.prev = 6;
516
+ _context.next = 9;
517
+ return Promise.all([strapiClient.get('/projects', {
518
+ params: strapiParams,
515
519
  cache: cache
516
520
  }), strapiClient.get('/projects', {
517
- params: _extends({}, params, {
521
+ params: _extends({}, strapiParams, {
518
522
  locale: FALLBACK_LOCALE
519
523
  }),
520
524
  cache: cache
521
525
  })]);
522
- case 6:
526
+ case 9:
523
527
  _yield$Promise$all = _context.sent;
524
- fpmProjects = _yield$Promise$all[0].data;
525
- strapiProjectsLocalized = _yield$Promise$all[1].data;
526
- strapiProjectsEnglish = _yield$Promise$all[2].data;
527
- strapiProjects = new Map();
528
- for (_i = 0, _arr = [].concat(strapiProjectsEnglish.data, strapiProjectsLocalized.data); _i < _arr.length; _i++) {
528
+ strapiProjectsLocalized = _yield$Promise$all[0];
529
+ strapiProjectsEnglish = _yield$Promise$all[1];
530
+ // Process Strapi data if we got it
531
+ for (_i = 0, _arr = [].concat(strapiProjectsEnglish.data.data, strapiProjectsLocalized.data.data); _i < _arr.length; _i++) {
529
532
  project = _arr[_i];
530
533
  if (project.attributes.fpmProjectId) {
531
534
  strapiProjects.set(project.attributes.fpmProjectId, project);
532
535
  }
533
536
  }
537
+ _context.next = 18;
538
+ break;
539
+ case 15:
540
+ _context.prev = 15;
541
+ _context.t0 = _context["catch"](6);
542
+ console.warn('Failed to fetch Strapi data:', _context.t0);
543
+ // Return empty map on failure
544
+ case 18:
545
+ return _context.abrupt("return", strapiProjects);
546
+ case 19:
547
+ case "end":
548
+ return _context.stop();
549
+ }
550
+ }, _callee, null, [[6, 15]]);
551
+ }));
552
+ return function getStrapiProjects(_x, _x2, _x3) {
553
+ return _ref.apply(this, arguments);
554
+ };
555
+ }();
556
+
557
+ var getPortfolioProjects = /*#__PURE__*/function () {
558
+ var _ref = /*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee(locale, preview) {
559
+ var cache, _yield$Promise$all, fpmProjects, strapiProjects;
560
+ return _regeneratorRuntime().wrap(function _callee$(_context) {
561
+ while (1) switch (_context.prev = _context.next) {
562
+ case 0:
563
+ if (locale === void 0) {
564
+ locale = 'en';
565
+ }
566
+ if (preview === void 0) {
567
+ preview = false;
568
+ }
569
+ cache = preview ? false : undefined;
570
+ _context.next = 5;
571
+ return Promise.all([fpmClient.get('/public/projects', {
572
+ cache: cache
573
+ }), getStrapiProjects(locale, STRAPI_DEFAULT_POPULATE_DEPTH, preview)]);
574
+ case 5:
575
+ _yield$Promise$all = _context.sent;
576
+ fpmProjects = _yield$Promise$all[0].data;
577
+ strapiProjects = _yield$Promise$all[1];
534
578
  return _context.abrupt("return", fpmProjects.map(function (fpmProject) {
535
579
  var _strapiProject$attrib;
536
580
  var strapiProject = strapiProjects.get(fpmProject.id);
@@ -546,7 +590,7 @@ var getPortfolioProjects = /*#__PURE__*/function () {
546
590
  }
547
591
  return toReturn;
548
592
  }));
549
- case 13:
593
+ case 9:
550
594
  case "end":
551
595
  return _context.stop();
552
596
  }
@@ -1320,8 +1364,8 @@ var openHubSpotChat = function openHubSpotChat() {
1320
1364
  }
1321
1365
  };
1322
1366
 
1323
- var _templateObject$9;
1324
- var GLOBAL_STYLE = /*#__PURE__*/react$1.css(_templateObject$9 || (_templateObject$9 = /*#__PURE__*/_taggedTemplateLiteralLoose(["\n :root {\n --default-hero-height: calc(100vh - var(--boemly-space-24));\n }\n\n a {\n text-decoration: none;\n }\n"])));
1367
+ var _templateObject$8;
1368
+ var GLOBAL_STYLE = /*#__PURE__*/react$1.css(_templateObject$8 || (_templateObject$8 = /*#__PURE__*/_taggedTemplateLiteralLoose(["\n :root {\n --default-hero-height: calc(100vh - var(--boemly-space-24));\n }\n\n a {\n text-decoration: none;\n }\n"])));
1325
1369
 
1326
1370
  var messagesDe$j = {
1327
1371
  'sections.comparison.backgroundShapes': 'Hintergrundformen'
@@ -2256,8 +2300,8 @@ var LogoGridWithText = function LogoGridWithText(_ref) {
2256
2300
  })))));
2257
2301
  };
2258
2302
 
2259
- var _templateObject$8, _templateObject2$5, _templateObject3$2, _templateObject4$1, _templateObject5;
2260
- var MapHeroContainer = /*#__PURE__*/styled__default.default(boemly.Box)(_templateObject$8 || (_templateObject$8 = /*#__PURE__*/_taggedTemplateLiteralLoose(["\n position: relative;\n width: 100vw;\n height: var(--default-hero-height);\n min-height: var(--boemly-sizes-3xl);\n background-color: var(--boemly-colors-primary-50);\n overflow: hidden;\n z-index: var(--boemly-zIndices-base);\n\n @media screen and (max-width: ", ") {\n height: auto;\n }\n"])), BREAKPOINT_LG);
2303
+ var _templateObject$7, _templateObject2$5, _templateObject3$2, _templateObject4$1, _templateObject5;
2304
+ var MapHeroContainer = /*#__PURE__*/styled__default.default(boemly.Box)(_templateObject$7 || (_templateObject$7 = /*#__PURE__*/_taggedTemplateLiteralLoose(["\n position: relative;\n width: 100vw;\n height: var(--default-hero-height);\n min-height: var(--boemly-sizes-3xl);\n background-color: var(--boemly-colors-primary-50);\n overflow: hidden;\n z-index: var(--boemly-zIndices-base);\n\n @media screen and (max-width: ", ") {\n height: auto;\n }\n"])), BREAKPOINT_LG);
2261
2305
  var MapHeroTextContainer = /*#__PURE__*/styled__default.default(boemly.Box)(_templateObject2$5 || (_templateObject2$5 = /*#__PURE__*/_taggedTemplateLiteralLoose(["\n position: absolute;\n width: 100vw;\n top: 56%;\n left: 0;\n transform: translateY(-50%);\n z-index: var(--boemly-zIndices-aboveBase);\n\n @media screen and (max-width: ", ") {\n position: relative;\n transform: unset;\n\n padding-top: var(--boemly-space-32);\n }\n"])), BREAKPOINT_LG);
2262
2306
  var ShapeContainer = /*#__PURE__*/styled__default.default(boemly.Box)(_templateObject3$2 || (_templateObject3$2 = /*#__PURE__*/_taggedTemplateLiteralLoose(["\n position: absolute;\n bottom: calc(var(--boemly-space-8) * -1);\n left: 0;\n\n width: var(--boemly-sizes-sm);\n height: var(--boemly-sizes-sm);\n\n border-top-right-radius: var(--boemly-radii-full);\n\n & span,\n div {\n border-top-right-radius: var(--boemly-radii-full);\n }\n\n @media screen and (max-width: ", ") {\n display: none;\n }\n"])), BREAKPOINT_LG);
2263
2307
  var MapContainer = /*#__PURE__*/styled__default.default(boemly.Box)(_templateObject4$1 || (_templateObject4$1 = /*#__PURE__*/_taggedTemplateLiteralLoose(["\n position: absolute;\n\n width: 50%;\n height: 100%;\n\n right: 0;\n top: 0;\n\n & img {\n object-fit: cover !important;\n }\n\n @media screen and (max-width: ", ") {\n width: 100%;\n height: var(--boemly-sizes-4xl);\n position: relative;\n margin-top: calc(var(--boemly-space-72) * -1);\n background-color: var(--boemly-colors-white);\n\n & img {\n object-fit: contain !important;\n }\n }\n"])), BREAKPOINT_LG);
@@ -2719,7 +2763,7 @@ var Steps = function Steps(_ref) {
2719
2763
  })))));
2720
2764
  };
2721
2765
 
2722
- var _oppositesOfCorners, _templateObject$7, _templateObject2$4;
2766
+ var _oppositesOfCorners, _templateObject$6, _templateObject2$4;
2723
2767
  var ShapePosition;
2724
2768
  (function (ShapePosition) {
2725
2769
  ShapePosition["topLeft"] = "top-left";
@@ -2822,7 +2866,7 @@ var TextCardGrid = function TextCardGrid(_ref) {
2822
2866
  borderBottomLeftRadius: oppositesOfCorners[variants[slice.variant].positionIcon(index)].includes('bottomLeft') ? 'full' : 'unset',
2823
2867
  borderTopRightRadius: oppositesOfCorners[variants[slice.variant].positionIcon(index)].includes('topRight') ? 'full' : 'unset',
2824
2868
  borderTopLeftRadius: oppositesOfCorners[variants[slice.variant].positionIcon(index)].includes('topLeft') ? 'full' : 'unset',
2825
- css: variants[slice.variant].positionIcon(index).includes('unset') ? react$1.css(_templateObject$7 || (_templateObject$7 = _taggedTemplateLiteralLoose(["\n & span,\n div,\n img {\n border-radius: var(--boemly-radii-xl);\n }\n "]))) : react$1.css(_templateObject2$4 || (_templateObject2$4 = _taggedTemplateLiteralLoose(["\n & span,\n div,\n img {\n border-", "-radius: var(--boemly-radii-full);\n }\n "])), oppositesOfCorners[variants[slice.variant].positionIcon(index)])
2869
+ css: variants[slice.variant].positionIcon(index).includes('unset') ? react$1.css(_templateObject$6 || (_templateObject$6 = _taggedTemplateLiteralLoose(["\n & span,\n div,\n img {\n border-radius: var(--boemly-radii-xl);\n }\n "]))) : react$1.css(_templateObject2$4 || (_templateObject2$4 = _taggedTemplateLiteralLoose(["\n & span,\n div,\n img {\n border-", "-radius: var(--boemly-radii-full);\n }\n "])), oppositesOfCorners[variants[slice.variant].positionIcon(index)])
2826
2870
  }, React__default.default.createElement(Image__default.default, {
2827
2871
  src: strapiMediaUrl(image.img, 'small'),
2828
2872
  alt: image.alt,
@@ -2871,8 +2915,8 @@ var TextCardGrid = function TextCardGrid(_ref) {
2871
2915
  }))));
2872
2916
  };
2873
2917
 
2874
- var _templateObject$6, _templateObject2$3, _templateObject3$1;
2875
- var CarouselContainer = /*#__PURE__*/styled__default.default(boemly.Box)(_templateObject$6 || (_templateObject$6 = /*#__PURE__*/_taggedTemplateLiteralLoose(["\n margin-top: var(--boemly-space-6);\n padding: var(--boemly-space-8) 0;\n\n @media screen and (max-width: ", ") {\n margin-top: var(--boemly-space-4);\n width: var(--boemly-sizes-full);\n }\n\n width: var(--boemly-sizes-full);\n\n overflow-x: hidden;\n\n @media screen and (max-width: ", ") {\n overflow-x: scroll;\n }\n"])), BREAKPOINT_MD, BREAKPOINT_MD);
2918
+ var _templateObject$5, _templateObject2$3, _templateObject3$1;
2919
+ var CarouselContainer = /*#__PURE__*/styled__default.default(boemly.Box)(_templateObject$5 || (_templateObject$5 = /*#__PURE__*/_taggedTemplateLiteralLoose(["\n margin-top: var(--boemly-space-6);\n padding: var(--boemly-space-8) 0;\n\n @media screen and (max-width: ", ") {\n margin-top: var(--boemly-space-4);\n width: var(--boemly-sizes-full);\n }\n\n width: var(--boemly-sizes-full);\n\n overflow-x: hidden;\n\n @media screen and (max-width: ", ") {\n overflow-x: scroll;\n }\n"])), BREAKPOINT_MD, BREAKPOINT_MD);
2876
2920
  var CarouselInnerContainer$1 = /*#__PURE__*/styled__default.default(framerMotion.motion.div)(_templateObject2$3 || (_templateObject2$3 = /*#__PURE__*/_taggedTemplateLiteralLoose(["\n display: flex;\n gap: var(--boemly-space-6);\n justify-content: center;\n\n width: calc(\n (var(--boemly-sizes-sm) + var(--boemly-space-6)) *\n ", " +\n var(--boemly-space-6)\n );\n min-width: var(--boemly-sizes-full);\n\n @media screen and (max-width: ", ") {\n gap: var(--boemly-space-1);\n justify-content: flex-start;\n width: calc(\n (var(--boemly-sizes-2xs) + var(--boemly-space-4)) *\n ", " +\n var(--boemly-space-6)\n );\n }\n"])), function (_ref) {
2877
2921
  var numberOfItems = _ref.numberOfItems;
2878
2922
  return numberOfItems;
@@ -3533,8 +3577,8 @@ var SmallHero = function SmallHero(_ref) {
3533
3577
  })))));
3534
3578
  };
3535
3579
 
3536
- var _templateObject$5, _templateObject2$2;
3537
- var BlogItemContainer = /*#__PURE__*/styled__default.default(boemly.Link)(_templateObject$5 || (_templateObject$5 = /*#__PURE__*/_taggedTemplateLiteralLoose(["\n text-decoration: none;\n\n & div img {\n transition: transform var(--default-ease) var(--medium-transition-duration);\n }\n\n &:hover {\n text-decoration: none;\n\n & > div:first-of-type img {\n transform: scale(1.03);\n }\n }\n"])));
3580
+ var _templateObject$4, _templateObject2$2;
3581
+ var BlogItemContainer = /*#__PURE__*/styled__default.default(boemly.Link)(_templateObject$4 || (_templateObject$4 = /*#__PURE__*/_taggedTemplateLiteralLoose(["\n text-decoration: none;\n\n & div img {\n transition: transform var(--default-ease) var(--medium-transition-duration);\n }\n\n &:hover {\n text-decoration: none;\n\n & > div:first-of-type img {\n transform: scale(1.03);\n }\n }\n"])));
3538
3582
  var ImageContainer$1 = /*#__PURE__*/styled__default.default(boemly.Box)(_templateObject2$2 || (_templateObject2$2 = /*#__PURE__*/_taggedTemplateLiteralLoose(["\n width: 100%;\n height: var(--boemly-sizes-xs);\n position: relative;\n border-radius: var(--boemly-radii-2xl);\n\n // Fixes the flickering of borders during animation in Safari\n -webkit-mask-image: -webkit-radial-gradient(white, black);\n\n & span,\n div {\n border-radius: var(--boemly-radii-2xl);\n }\n\n @media screen and (max-width: ", ") {\n height: var(--boemly-sizes-3xs);\n }\n"])), BREAKPOINT_MD);
3539
3583
 
3540
3584
  var Blog = function Blog(_ref) {
@@ -3652,166 +3696,506 @@ var MapBoxStyle;
3652
3696
  })(MapBoxStyle || (MapBoxStyle = {}));
3653
3697
  (process.env.NEXT_PUBLIC_MAPBOX_TILES_URL || 'http://localhost:8123') + "/vectortiles/v1/plots/{z}/{x}/{y}.mvt";
3654
3698
  var MAPBOX_MAX_ZOOM = 19;
3655
- var MAPBOX_INITIAL_ZOOM = 13;
3656
-
3657
- var mergeBoundingBoxes = function mergeBoundingBoxes(boundingBoxes) {
3658
- var minLeft = 180;
3659
- var minBottom = 90;
3660
- var maxRight = -180;
3661
- var maxTop = -90;
3662
- boundingBoxes.forEach(function (_ref) {
3663
- var left = _ref[0],
3664
- bottom = _ref[1],
3665
- right = _ref[2],
3666
- top = _ref[3];
3667
- if (left < minLeft) minLeft = left;
3668
- if (bottom < minBottom) minBottom = bottom;
3669
- if (right > maxRight) maxRight = right;
3670
- if (top > maxTop) maxTop = top;
3671
- });
3672
- return [minLeft, minBottom, maxRight, maxTop];
3673
- };
3674
3699
 
3675
- var FONT_CUSTOMIZATIONS = {
3676
- body: 'Inter',
3677
- heading: 'Inter',
3678
- display: 'GintoNord',
3679
- mono: 'SpaceMono'
3680
- };
3700
+ var _templateObject$3;
3701
+ var mapboxStyle = /*#__PURE__*/react$1.css(_templateObject$3 || (_templateObject$3 = /*#__PURE__*/_taggedTemplateLiteralLoose(["\n .mapboxgl-map {\n -webkit-tap-highlight-color: rgb(0 0 0/0);\n font: 12px/20px Helvetica Neue, Arial, Helvetica, sans-serif;\n overflow: hidden;\n position: relative;\n }\n .mapboxgl-canvas {\n left: 0;\n position: absolute;\n top: 0;\n }\n .mapboxgl-map:-webkit-full-screen {\n height: 100%;\n width: 100%;\n }\n .mapboxgl-canary {\n background-color: salmon;\n }\n .mapboxgl-canvas-container.mapboxgl-interactive,\n .mapboxgl-ctrl-group button.mapboxgl-ctrl-compass {\n cursor: grab;\n -webkit-user-select: none;\n user-select: none;\n }\n .mapboxgl-canvas-container.mapboxgl-interactive.mapboxgl-track-pointer {\n cursor: pointer;\n }\n .mapboxgl-canvas-container.mapboxgl-interactive:active,\n .mapboxgl-ctrl-group button.mapboxgl-ctrl-compass:active {\n cursor: grabbing;\n }\n .mapboxgl-canvas-container.mapboxgl-touch-zoom-rotate,\n .mapboxgl-canvas-container.mapboxgl-touch-zoom-rotate .mapboxgl-canvas {\n touch-action: pan-x pan-y;\n }\n .mapboxgl-canvas-container.mapboxgl-touch-drag-pan,\n .mapboxgl-canvas-container.mapboxgl-touch-drag-pan .mapboxgl-canvas {\n touch-action: pinch-zoom;\n }\n .mapboxgl-canvas-container.mapboxgl-touch-zoom-rotate.mapboxgl-touch-drag-pan,\n .mapboxgl-canvas-container.mapboxgl-touch-zoom-rotate.mapboxgl-touch-drag-pan\n .mapboxgl-canvas {\n touch-action: none;\n }\n .mapboxgl-ctrl-bottom-left,\n .mapboxgl-ctrl-bottom-right,\n .mapboxgl-ctrl-top-left,\n .mapboxgl-ctrl-top-right {\n pointer-events: none;\n position: absolute;\n z-index: 2;\n }\n .mapboxgl-ctrl-top-left {\n left: 0;\n top: 0;\n }\n .mapboxgl-ctrl-top-right {\n right: 0;\n top: 0;\n }\n .mapboxgl-ctrl-bottom-left {\n bottom: 0;\n left: 0;\n }\n .mapboxgl-ctrl-bottom-right {\n bottom: 0;\n right: 0;\n }\n .mapboxgl-ctrl {\n clear: both;\n pointer-events: auto;\n transform: translate(0);\n }\n .mapboxgl-ctrl-top-left .mapboxgl-ctrl {\n float: left;\n margin: 10px 0 0 10px;\n }\n .mapboxgl-ctrl-top-right .mapboxgl-ctrl {\n float: right;\n margin: 10px 10px 0 0;\n }\n .mapboxgl-ctrl-bottom-left .mapboxgl-ctrl {\n float: left;\n margin: 0 0 10px 10px;\n }\n .mapboxgl-ctrl-bottom-right .mapboxgl-ctrl {\n float: right;\n margin: 0 10px 10px 0;\n }\n .mapboxgl-ctrl-group {\n background: #fff;\n border-radius: 4px;\n }\n .mapboxgl-ctrl-group:not(:empty) {\n box-shadow: 0 0 0 2px rgba(0, 0, 0, 0.1);\n }\n @media (-ms-high-contrast: active) {\n .mapboxgl-ctrl-group:not(:empty) {\n box-shadow: 0 0 0 2px ButtonText;\n }\n }\n .mapboxgl-ctrl-group button {\n background-color: transparent;\n border: 0;\n box-sizing: border-box;\n cursor: pointer;\n display: block;\n height: 29px;\n outline: none;\n overflow: hidden;\n padding: 0;\n width: 29px;\n }\n .mapboxgl-ctrl-group button + button {\n border-top: 1px solid #ddd;\n }\n .mapboxgl-ctrl button .mapboxgl-ctrl-icon {\n background-position: 50%;\n background-repeat: no-repeat;\n display: block;\n height: 100%;\n width: 100%;\n }\n @media (-ms-high-contrast: active) {\n .mapboxgl-ctrl-icon {\n background-color: transparent;\n }\n .mapboxgl-ctrl-group button + button {\n border-top: 1px solid ButtonText;\n }\n }\n .mapboxgl-ctrl-attrib-button:focus,\n .mapboxgl-ctrl-group button:focus {\n box-shadow: 0 0 2px 2px #0096ff;\n }\n .mapboxgl-ctrl button:disabled {\n cursor: not-allowed;\n }\n .mapboxgl-ctrl button:disabled .mapboxgl-ctrl-icon {\n opacity: 0.25;\n }\n .mapboxgl-ctrl-group button:first-of-type {\n border-radius: 4px 4px 0 0;\n }\n .mapboxgl-ctrl-group button:last-of-type {\n border-radius: 0 0 4px 4px;\n }\n .mapboxgl-ctrl-group button:only-of-type {\n border-radius: inherit;\n }\n .mapboxgl-ctrl button:not(:disabled):hover {\n background-color: rgb(0 0 0/5%);\n }\n .mapboxgl-ctrl-group button:focus:focus-visible {\n box-shadow: 0 0 2px 2px #0096ff;\n }\n .mapboxgl-ctrl-group button:focus:not(:focus-visible) {\n box-shadow: none;\n }\n .mapboxgl-ctrl button.mapboxgl-ctrl-zoom-out .mapboxgl-ctrl-icon {\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23333' viewBox='0 0 29 29'%3E%3Cpath d='M10 13c-.75 0-1.5.75-1.5 1.5S9.25 16 10 16h9c.75 0 1.5-.75 1.5-1.5S19.75 13 19 13h-9z'/%3E%3C/svg%3E\");\n }\n .mapboxgl-ctrl button.mapboxgl-ctrl-zoom-in .mapboxgl-ctrl-icon {\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23333' viewBox='0 0 29 29'%3E%3Cpath d='M14.5 8.5c-.75 0-1.5.75-1.5 1.5v3h-3c-.75 0-1.5.75-1.5 1.5S9.25 16 10 16h3v3c0 .75.75 1.5 1.5 1.5S16 19.75 16 19v-3h3c.75 0 1.5-.75 1.5-1.5S19.75 13 19 13h-3v-3c0-.75-.75-1.5-1.5-1.5z'/%3E%3C/svg%3E\");\n }\n @media (-ms-high-contrast: active) {\n .mapboxgl-ctrl button.mapboxgl-ctrl-zoom-out .mapboxgl-ctrl-icon {\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 29 29'%3E%3Cpath d='M10 13c-.75 0-1.5.75-1.5 1.5S9.25 16 10 16h9c.75 0 1.5-.75 1.5-1.5S19.75 13 19 13h-9z'/%3E%3C/svg%3E\");\n }\n .mapboxgl-ctrl button.mapboxgl-ctrl-zoom-in .mapboxgl-ctrl-icon {\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 29 29'%3E%3Cpath d='M14.5 8.5c-.75 0-1.5.75-1.5 1.5v3h-3c-.75 0-1.5.75-1.5 1.5S9.25 16 10 16h3v3c0 .75.75 1.5 1.5 1.5S16 19.75 16 19v-3h3c.75 0 1.5-.75 1.5-1.5S19.75 13 19 13h-3v-3c0-.75-.75-1.5-1.5-1.5z'/%3E%3C/svg%3E\");\n }\n }\n @media (-ms-high-contrast: black-on-white) {\n .mapboxgl-ctrl button.mapboxgl-ctrl-zoom-out .mapboxgl-ctrl-icon {\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23000' viewBox='0 0 29 29'%3E%3Cpath d='M10 13c-.75 0-1.5.75-1.5 1.5S9.25 16 10 16h9c.75 0 1.5-.75 1.5-1.5S19.75 13 19 13h-9z'/%3E%3C/svg%3E\");\n }\n .mapboxgl-ctrl button.mapboxgl-ctrl-zoom-in .mapboxgl-ctrl-icon {\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23000' viewBox='0 0 29 29'%3E%3Cpath d='M14.5 8.5c-.75 0-1.5.75-1.5 1.5v3h-3c-.75 0-1.5.75-1.5 1.5S9.25 16 10 16h3v3c0 .75.75 1.5 1.5 1.5S16 19.75 16 19v-3h3c.75 0 1.5-.75 1.5-1.5S19.75 13 19 13h-3v-3c0-.75-.75-1.5-1.5-1.5z'/%3E%3C/svg%3E\");\n }\n }\n .mapboxgl-ctrl button.mapboxgl-ctrl-fullscreen .mapboxgl-ctrl-icon {\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23333' viewBox='0 0 29 29'%3E%3Cpath d='M24 16v5.5c0 1.75-.75 2.5-2.5 2.5H16v-1l3-1.5-4-5.5 1-1 5.5 4 1.5-3h1zM6 16l1.5 3 5.5-4 1 1-4 5.5 3 1.5v1H7.5C5.75 24 5 23.25 5 21.5V16h1zm7-11v1l-3 1.5 4 5.5-1 1-5.5-4L6 13H5V7.5C5 5.75 5.75 5 7.5 5H13zm11 2.5c0-1.75-.75-2.5-2.5-2.5H16v1l3 1.5-4 5.5 1 1 5.5-4 1.5 3h1V7.5z'/%3E%3C/svg%3E\");\n }\n .mapboxgl-ctrl button.mapboxgl-ctrl-shrink .mapboxgl-ctrl-icon {\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 29 29'%3E%3Cpath d='M18.5 16c-1.75 0-2.5.75-2.5 2.5V24h1l1.5-3 5.5 4 1-1-4-5.5 3-1.5v-1h-5.5zM13 18.5c0-1.75-.75-2.5-2.5-2.5H5v1l3 1.5L4 24l1 1 5.5-4 1.5 3h1v-5.5zm3-8c0 1.75.75 2.5 2.5 2.5H24v-1l-3-1.5L25 5l-1-1-5.5 4L17 5h-1v5.5zM10.5 13c1.75 0 2.5-.75 2.5-2.5V5h-1l-1.5 3L5 4 4 5l4 5.5L5 12v1h5.5z'/%3E%3C/svg%3E\");\n }\n @media (-ms-high-contrast: active) {\n .mapboxgl-ctrl button.mapboxgl-ctrl-fullscreen .mapboxgl-ctrl-icon {\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 29 29'%3E%3Cpath d='M24 16v5.5c0 1.75-.75 2.5-2.5 2.5H16v-1l3-1.5-4-5.5 1-1 5.5 4 1.5-3h1zM6 16l1.5 3 5.5-4 1 1-4 5.5 3 1.5v1H7.5C5.75 24 5 23.25 5 21.5V16h1zm7-11v1l-3 1.5 4 5.5-1 1-5.5-4L6 13H5V7.5C5 5.75 5.75 5 7.5 5H13zm11 2.5c0-1.75-.75-2.5-2.5-2.5H16v1l3 1.5-4 5.5 1 1 5.5-4 1.5 3h1V7.5z'/%3E%3C/svg%3E\");\n }\n .mapboxgl-ctrl button.mapboxgl-ctrl-shrink .mapboxgl-ctrl-icon {\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 29 29'%3E%3Cpath d='M18.5 16c-1.75 0-2.5.75-2.5 2.5V24h1l1.5-3 5.5 4 1-1-4-5.5 3-1.5v-1h-5.5zM13 18.5c0-1.75-.75-2.5-2.5-2.5H5v1l3 1.5L4 24l1 1 5.5-4 1.5 3h1v-5.5zm3-8c0 1.75.75 2.5 2.5 2.5H24v-1l-3-1.5L25 5l-1-1-5.5 4L17 5h-1v5.5zM10.5 13c1.75 0 2.5-.75 2.5-2.5V5h-1l-1.5 3L5 4 4 5l4 5.5L5 12v1h5.5z'/%3E%3C/svg%3E\");\n }\n }\n @media (-ms-high-contrast: black-on-white) {\n .mapboxgl-ctrl button.mapboxgl-ctrl-fullscreen .mapboxgl-ctrl-icon {\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23000' viewBox='0 0 29 29'%3E%3Cpath d='M24 16v5.5c0 1.75-.75 2.5-2.5 2.5H16v-1l3-1.5-4-5.5 1-1 5.5 4 1.5-3h1zM6 16l1.5 3 5.5-4 1 1-4 5.5 3 1.5v1H7.5C5.75 24 5 23.25 5 21.5V16h1zm7-11v1l-3 1.5 4 5.5-1 1-5.5-4L6 13H5V7.5C5 5.75 5.75 5 7.5 5H13zm11 2.5c0-1.75-.75-2.5-2.5-2.5H16v1l3 1.5-4 5.5 1 1 5.5-4 1.5 3h1V7.5z'/%3E%3C/svg%3E\");\n }\n .mapboxgl-ctrl button.mapboxgl-ctrl-shrink .mapboxgl-ctrl-icon {\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23000' viewBox='0 0 29 29'%3E%3Cpath d='M18.5 16c-1.75 0-2.5.75-2.5 2.5V24h1l1.5-3 5.5 4 1-1-4-5.5 3-1.5v-1h-5.5zM13 18.5c0-1.75-.75-2.5-2.5-2.5H5v1l3 1.5L4 24l1 1 5.5-4 1.5 3h1v-5.5zm3-8c0 1.75.75 2.5 2.5 2.5H24v-1l-3-1.5L25 5l-1-1-5.5 4L17 5h-1v5.5zM10.5 13c1.75 0 2.5-.75 2.5-2.5V5h-1l-1.5 3L5 4 4 5l4 5.5L5 12v1h5.5z'/%3E%3C/svg%3E\");\n }\n }\n .mapboxgl-ctrl button.mapboxgl-ctrl-compass .mapboxgl-ctrl-icon {\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23333' viewBox='0 0 29 29'%3E%3Cpath d='M10.5 14l4-8 4 8h-8z'/%3E%3Cpath id='south' d='M10.5 16l4 8 4-8h-8z' fill='%23ccc'/%3E%3C/svg%3E\");\n }\n @media (-ms-high-contrast: active) {\n .mapboxgl-ctrl button.mapboxgl-ctrl-compass .mapboxgl-ctrl-icon {\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 29 29'%3E%3Cpath d='M10.5 14l4-8 4 8h-8z'/%3E%3Cpath id='south' d='M10.5 16l4 8 4-8h-8z' fill='%23999'/%3E%3C/svg%3E\");\n }\n }\n @media (-ms-high-contrast: black-on-white) {\n .mapboxgl-ctrl button.mapboxgl-ctrl-compass .mapboxgl-ctrl-icon {\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23000' viewBox='0 0 29 29'%3E%3Cpath d='M10.5 14l4-8 4 8h-8z'/%3E%3Cpath id='south' d='M10.5 16l4 8 4-8h-8z' fill='%23ccc'/%3E%3C/svg%3E\");\n }\n }\n .mapboxgl-ctrl button.mapboxgl-ctrl-geolocate .mapboxgl-ctrl-icon {\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill='%23333'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7z'/%3E%3Ccircle id='dot' cx='10' cy='10' r='2'/%3E%3Cpath id='stroke' d='M14 5l1 1-9 9-1-1 9-9z' display='none'/%3E%3C/svg%3E\");\n }\n .mapboxgl-ctrl button.mapboxgl-ctrl-geolocate:disabled .mapboxgl-ctrl-icon {\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill='%23aaa'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7z'/%3E%3Ccircle id='dot' cx='10' cy='10' r='2'/%3E%3Cpath id='stroke' d='M14 5l1 1-9 9-1-1 9-9z' fill='%23f00'/%3E%3C/svg%3E\");\n }\n .mapboxgl-ctrl\n button.mapboxgl-ctrl-geolocate.mapboxgl-ctrl-geolocate-active\n .mapboxgl-ctrl-icon {\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill='%2333b5e5'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7z'/%3E%3Ccircle id='dot' cx='10' cy='10' r='2'/%3E%3Cpath id='stroke' d='M14 5l1 1-9 9-1-1 9-9z' display='none'/%3E%3C/svg%3E\");\n }\n .mapboxgl-ctrl\n button.mapboxgl-ctrl-geolocate.mapboxgl-ctrl-geolocate-active-error\n .mapboxgl-ctrl-icon {\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill='%23e58978'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7z'/%3E%3Ccircle id='dot' cx='10' cy='10' r='2'/%3E%3Cpath id='stroke' d='M14 5l1 1-9 9-1-1 9-9z' display='none'/%3E%3C/svg%3E\");\n }\n .mapboxgl-ctrl\n button.mapboxgl-ctrl-geolocate.mapboxgl-ctrl-geolocate-background\n .mapboxgl-ctrl-icon {\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill='%2333b5e5'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7z'/%3E%3Ccircle id='dot' cx='10' cy='10' r='2' display='none'/%3E%3Cpath id='stroke' d='M14 5l1 1-9 9-1-1 9-9z' display='none'/%3E%3C/svg%3E\");\n }\n .mapboxgl-ctrl\n button.mapboxgl-ctrl-geolocate.mapboxgl-ctrl-geolocate-background-error\n .mapboxgl-ctrl-icon {\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill='%23e54e33'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7z'/%3E%3Ccircle id='dot' cx='10' cy='10' r='2' display='none'/%3E%3Cpath id='stroke' d='M14 5l1 1-9 9-1-1 9-9z' display='none'/%3E%3C/svg%3E\");\n }\n .mapboxgl-ctrl\n button.mapboxgl-ctrl-geolocate.mapboxgl-ctrl-geolocate-waiting\n .mapboxgl-ctrl-icon {\n animation: mapboxgl-spin 2s linear infinite;\n }\n @media (-ms-high-contrast: active) {\n .mapboxgl-ctrl button.mapboxgl-ctrl-geolocate .mapboxgl-ctrl-icon {\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill='%23fff'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7z'/%3E%3Ccircle id='dot' cx='10' cy='10' r='2'/%3E%3Cpath id='stroke' d='M14 5l1 1-9 9-1-1 9-9z' display='none'/%3E%3C/svg%3E\");\n }\n .mapboxgl-ctrl button.mapboxgl-ctrl-geolocate:disabled .mapboxgl-ctrl-icon {\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill='%23999'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7z'/%3E%3Ccircle id='dot' cx='10' cy='10' r='2'/%3E%3Cpath id='stroke' d='M14 5l1 1-9 9-1-1 9-9z' fill='%23f00'/%3E%3C/svg%3E\");\n }\n .mapboxgl-ctrl\n button.mapboxgl-ctrl-geolocate.mapboxgl-ctrl-geolocate-active\n .mapboxgl-ctrl-icon {\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill='%2333b5e5'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7z'/%3E%3Ccircle id='dot' cx='10' cy='10' r='2'/%3E%3Cpath id='stroke' d='M14 5l1 1-9 9-1-1 9-9z' display='none'/%3E%3C/svg%3E\");\n }\n .mapboxgl-ctrl\n button.mapboxgl-ctrl-geolocate.mapboxgl-ctrl-geolocate-active-error\n .mapboxgl-ctrl-icon {\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill='%23e58978'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7z'/%3E%3Ccircle id='dot' cx='10' cy='10' r='2'/%3E%3Cpath id='stroke' d='M14 5l1 1-9 9-1-1 9-9z' display='none'/%3E%3C/svg%3E\");\n }\n .mapboxgl-ctrl\n button.mapboxgl-ctrl-geolocate.mapboxgl-ctrl-geolocate-background\n .mapboxgl-ctrl-icon {\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill='%2333b5e5'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7z'/%3E%3Ccircle id='dot' cx='10' cy='10' r='2' display='none'/%3E%3Cpath id='stroke' d='M14 5l1 1-9 9-1-1 9-9z' display='none'/%3E%3C/svg%3E\");\n }\n .mapboxgl-ctrl\n button.mapboxgl-ctrl-geolocate.mapboxgl-ctrl-geolocate-background-error\n .mapboxgl-ctrl-icon {\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill='%23e54e33'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7z'/%3E%3Ccircle id='dot' cx='10' cy='10' r='2' display='none'/%3E%3Cpath id='stroke' d='M14 5l1 1-9 9-1-1 9-9z' display='none'/%3E%3C/svg%3E\");\n }\n }\n @media (-ms-high-contrast: black-on-white) {\n .mapboxgl-ctrl button.mapboxgl-ctrl-geolocate .mapboxgl-ctrl-icon {\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill='%23000'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7z'/%3E%3Ccircle id='dot' cx='10' cy='10' r='2'/%3E%3Cpath id='stroke' d='M14 5l1 1-9 9-1-1 9-9z' display='none'/%3E%3C/svg%3E\");\n }\n .mapboxgl-ctrl button.mapboxgl-ctrl-geolocate:disabled .mapboxgl-ctrl-icon {\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill='%23666'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7z'/%3E%3Ccircle id='dot' cx='10' cy='10' r='2'/%3E%3Cpath id='stroke' d='M14 5l1 1-9 9-1-1 9-9z' fill='%23f00'/%3E%3C/svg%3E\");\n }\n }\n @keyframes mapboxgl-spin {\n 0% {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(1turn);\n }\n }\n a.mapboxgl-ctrl-logo {\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' fill-rule='evenodd' viewBox='0 0 88 23'%3E%3Cdefs%3E%3Cpath id='logo' d='M11.5 2.25c5.105 0 9.25 4.145 9.25 9.25s-4.145 9.25-9.25 9.25-9.25-4.145-9.25-9.25 4.145-9.25 9.25-9.25zM6.997 15.983c-.051-.338-.828-5.802 2.233-8.873a4.395 4.395 0 013.13-1.28c1.27 0 2.49.51 3.39 1.42.91.9 1.42 2.12 1.42 3.39 0 1.18-.449 2.301-1.28 3.13C12.72 16.93 7 16 7 16l-.003-.017zM15.3 10.5l-2 .8-.8 2-.8-2-2-.8 2-.8.8-2 .8 2 2 .8z'/%3E%3Cpath id='text' d='M50.63 8c.13 0 .23.1.23.23V9c.7-.76 1.7-1.18 2.73-1.18 2.17 0 3.95 1.85 3.95 4.17s-1.77 4.19-3.94 4.19c-1.04 0-2.03-.43-2.74-1.18v3.77c0 .13-.1.23-.23.23h-1.4c-.13 0-.23-.1-.23-.23V8.23c0-.12.1-.23.23-.23h1.4zm-3.86.01c.01 0 .01 0 .01-.01.13 0 .22.1.22.22v7.55c0 .12-.1.23-.23.23h-1.4c-.13 0-.23-.1-.23-.23V15c-.7.76-1.69 1.19-2.73 1.19-2.17 0-3.94-1.87-3.94-4.19 0-2.32 1.77-4.19 3.94-4.19 1.03 0 2.02.43 2.73 1.18v-.75c0-.12.1-.23.23-.23h1.4zm26.375-.19a4.24 4.24 0 00-4.16 3.29c-.13.59-.13 1.19 0 1.77a4.233 4.233 0 004.17 3.3c2.35 0 4.26-1.87 4.26-4.19 0-2.32-1.9-4.17-4.27-4.17zM60.63 5c.13 0 .23.1.23.23v3.76c.7-.76 1.7-1.18 2.73-1.18 1.88 0 3.45 1.4 3.84 3.28.13.59.13 1.2 0 1.8-.39 1.88-1.96 3.29-3.84 3.29-1.03 0-2.02-.43-2.73-1.18v.77c0 .12-.1.23-.23.23h-1.4c-.13 0-.23-.1-.23-.23V5.23c0-.12.1-.23.23-.23h1.4zm-34 11h-1.4c-.13 0-.23-.11-.23-.23V8.22c.01-.13.1-.22.23-.22h1.4c.13 0 .22.11.23.22v.68c.5-.68 1.3-1.09 2.16-1.1h.03c1.09 0 2.09.6 2.6 1.55.45-.95 1.4-1.55 2.44-1.56 1.62 0 2.93 1.25 2.9 2.78l.03 5.2c0 .13-.1.23-.23.23h-1.41c-.13 0-.23-.11-.23-.23v-4.59c0-.98-.74-1.71-1.62-1.71-.8 0-1.46.7-1.59 1.62l.01 4.68c0 .13-.11.23-.23.23h-1.41c-.13 0-.23-.11-.23-.23v-4.59c0-.98-.74-1.71-1.62-1.71-.85 0-1.54.79-1.6 1.8v4.5c0 .13-.1.23-.23.23zm53.615 0h-1.61c-.04 0-.08-.01-.12-.03-.09-.06-.13-.19-.06-.28l2.43-3.71-2.39-3.65a.213.213 0 01-.03-.12c0-.12.09-.21.21-.21h1.61c.13 0 .24.06.3.17l1.41 2.37 1.4-2.37a.34.34 0 01.3-.17h1.6c.04 0 .08.01.12.03.09.06.13.19.06.28l-2.37 3.65 2.43 3.7c0 .05.01.09.01.13 0 .12-.09.21-.21.21h-1.61c-.13 0-.24-.06-.3-.17l-1.44-2.42-1.44 2.42a.34.34 0 01-.3.17zm-7.12-1.49c-1.33 0-2.42-1.12-2.42-2.51 0-1.39 1.08-2.52 2.42-2.52 1.33 0 2.42 1.12 2.42 2.51 0 1.39-1.08 2.51-2.42 2.52zm-19.865 0c-1.32 0-2.39-1.11-2.42-2.48v-.07c.02-1.38 1.09-2.49 2.4-2.49 1.32 0 2.41 1.12 2.41 2.51 0 1.39-1.07 2.52-2.39 2.53zm-8.11-2.48c-.01 1.37-1.09 2.47-2.41 2.47s-2.42-1.12-2.42-2.51c0-1.39 1.08-2.52 2.4-2.52 1.33 0 2.39 1.11 2.41 2.48l.02.08zm18.12 2.47c-1.32 0-2.39-1.11-2.41-2.48v-.06c.02-1.38 1.09-2.48 2.41-2.48s2.42 1.12 2.42 2.51c0 1.39-1.09 2.51-2.42 2.51z'/%3E%3C/defs%3E%3Cmask id='clip'%3E%3Crect x='0' y='0' width='100%25' height='100%25' fill='white'/%3E%3Cuse xlink:href='%23logo'/%3E%3Cuse xlink:href='%23text'/%3E%3C/mask%3E%3Cg id='outline' opacity='0.3' stroke='%23000' stroke-width='3'%3E%3Ccircle mask='url(%23clip)' cx='11.5' cy='11.5' r='9.25'/%3E%3Cuse xlink:href='%23text' mask='url(%23clip)'/%3E%3C/g%3E%3Cg id='fill' opacity='0.9' fill='%23fff'%3E%3Cuse xlink:href='%23logo'/%3E%3Cuse xlink:href='%23text'/%3E%3C/g%3E%3C/svg%3E\");\n background-repeat: no-repeat;\n cursor: pointer;\n display: block;\n height: 23px;\n margin: 0 0 -4px -4px;\n overflow: hidden;\n width: 88px;\n }\n a.mapboxgl-ctrl-logo.mapboxgl-compact {\n width: 23px;\n }\n @media (-ms-high-contrast: active) {\n a.mapboxgl-ctrl-logo {\n background-color: transparent;\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' fill-rule='evenodd' viewBox='0 0 88 23'%3E%3Cdefs%3E%3Cpath id='logo' d='M11.5 2.25c5.105 0 9.25 4.145 9.25 9.25s-4.145 9.25-9.25 9.25-9.25-4.145-9.25-9.25 4.145-9.25 9.25-9.25zM6.997 15.983c-.051-.338-.828-5.802 2.233-8.873a4.395 4.395 0 013.13-1.28c1.27 0 2.49.51 3.39 1.42.91.9 1.42 2.12 1.42 3.39 0 1.18-.449 2.301-1.28 3.13C12.72 16.93 7 16 7 16l-.003-.017zM15.3 10.5l-2 .8-.8 2-.8-2-2-.8 2-.8.8-2 .8 2 2 .8z'/%3E%3Cpath id='text' d='M50.63 8c.13 0 .23.1.23.23V9c.7-.76 1.7-1.18 2.73-1.18 2.17 0 3.95 1.85 3.95 4.17s-1.77 4.19-3.94 4.19c-1.04 0-2.03-.43-2.74-1.18v3.77c0 .13-.1.23-.23.23h-1.4c-.13 0-.23-.1-.23-.23V8.23c0-.12.1-.23.23-.23h1.4zm-3.86.01c.01 0 .01 0 .01-.01.13 0 .22.1.22.22v7.55c0 .12-.1.23-.23.23h-1.4c-.13 0-.23-.1-.23-.23V15c-.7.76-1.69 1.19-2.73 1.19-2.17 0-3.94-1.87-3.94-4.19 0-2.32 1.77-4.19 3.94-4.19 1.03 0 2.02.43 2.73 1.18v-.75c0-.12.1-.23.23-.23h1.4zm26.375-.19a4.24 4.24 0 00-4.16 3.29c-.13.59-.13 1.19 0 1.77a4.233 4.233 0 004.17 3.3c2.35 0 4.26-1.87 4.26-4.19 0-2.32-1.9-4.17-4.27-4.17zM60.63 5c.13 0 .23.1.23.23v3.76c.7-.76 1.7-1.18 2.73-1.18 1.88 0 3.45 1.4 3.84 3.28.13.59.13 1.2 0 1.8-.39 1.88-1.96 3.29-3.84 3.29-1.03 0-2.02-.43-2.73-1.18v.77c0 .12-.1.23-.23.23h-1.4c-.13 0-.23-.1-.23-.23V5.23c0-.12.1-.23.23-.23h1.4zm-34 11h-1.4c-.13 0-.23-.11-.23-.23V8.22c.01-.13.1-.22.23-.22h1.4c.13 0 .22.11.23.22v.68c.5-.68 1.3-1.09 2.16-1.1h.03c1.09 0 2.09.6 2.6 1.55.45-.95 1.4-1.55 2.44-1.56 1.62 0 2.93 1.25 2.9 2.78l.03 5.2c0 .13-.1.23-.23.23h-1.41c-.13 0-.23-.11-.23-.23v-4.59c0-.98-.74-1.71-1.62-1.71-.8 0-1.46.7-1.59 1.62l.01 4.68c0 .13-.11.23-.23.23h-1.41c-.13 0-.23-.11-.23-.23v-4.59c0-.98-.74-1.71-1.62-1.71-.85 0-1.54.79-1.6 1.8v4.5c0 .13-.1.23-.23.23zm53.615 0h-1.61c-.04 0-.08-.01-.12-.03-.09-.06-.13-.19-.06-.28l2.43-3.71-2.39-3.65a.213.213 0 01-.03-.12c0-.12.09-.21.21-.21h1.61c.13 0 .24.06.3.17l1.41 2.37 1.4-2.37a.34.34 0 01.3-.17h1.6c.04 0 .08.01.12.03.09.06.13.19.06.28l-2.37 3.65 2.43 3.7c0 .05.01.09.01.13 0 .12-.09.21-.21.21h-1.61c-.13 0-.24-.06-.3-.17l-1.44-2.42-1.44 2.42a.34.34 0 01-.3.17zm-7.12-1.49c-1.33 0-2.42-1.12-2.42-2.51 0-1.39 1.08-2.52 2.42-2.52 1.33 0 2.42 1.12 2.42 2.51 0 1.39-1.08 2.51-2.42 2.52zm-19.865 0c-1.32 0-2.39-1.11-2.42-2.48v-.07c.02-1.38 1.09-2.49 2.4-2.49 1.32 0 2.41 1.12 2.41 2.51 0 1.39-1.07 2.52-2.39 2.53zm-8.11-2.48c-.01 1.37-1.09 2.47-2.41 2.47s-2.42-1.12-2.42-2.51c0-1.39 1.08-2.52 2.4-2.52 1.33 0 2.39 1.11 2.41 2.48l.02.08zm18.12 2.47c-1.32 0-2.39-1.11-2.41-2.48v-.06c.02-1.38 1.09-2.48 2.41-2.48s2.42 1.12 2.42 2.51c0 1.39-1.09 2.51-2.42 2.51z'/%3E%3C/defs%3E%3Cmask id='clip'%3E%3Crect x='0' y='0' width='100%25' height='100%25' fill='white'/%3E%3Cuse xlink:href='%23logo'/%3E%3Cuse xlink:href='%23text'/%3E%3C/mask%3E%3Cg id='outline' opacity='1' stroke='%23000' stroke-width='3'%3E%3Ccircle mask='url(%23clip)' cx='11.5' cy='11.5' r='9.25'/%3E%3Cuse xlink:href='%23text' mask='url(%23clip)'/%3E%3C/g%3E%3Cg id='fill' opacity='1' fill='%23fff'%3E%3Cuse xlink:href='%23logo'/%3E%3Cuse xlink:href='%23text'/%3E%3C/g%3E%3C/svg%3E\");\n }\n }\n @media (-ms-high-contrast: black-on-white) {\n a.mapboxgl-ctrl-logo {\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' fill-rule='evenodd' viewBox='0 0 88 23'%3E%3Cdefs%3E%3Cpath id='logo' d='M11.5 2.25c5.105 0 9.25 4.145 9.25 9.25s-4.145 9.25-9.25 9.25-9.25-4.145-9.25-9.25 4.145-9.25 9.25-9.25zM6.997 15.983c-.051-.338-.828-5.802 2.233-8.873a4.395 4.395 0 013.13-1.28c1.27 0 2.49.51 3.39 1.42.91.9 1.42 2.12 1.42 3.39 0 1.18-.449 2.301-1.28 3.13C12.72 16.93 7 16 7 16l-.003-.017zM15.3 10.5l-2 .8-.8 2-.8-2-2-.8 2-.8.8-2 .8 2 2 .8z'/%3E%3Cpath id='text' d='M50.63 8c.13 0 .23.1.23.23V9c.7-.76 1.7-1.18 2.73-1.18 2.17 0 3.95 1.85 3.95 4.17s-1.77 4.19-3.94 4.19c-1.04 0-2.03-.43-2.74-1.18v3.77c0 .13-.1.23-.23.23h-1.4c-.13 0-.23-.1-.23-.23V8.23c0-.12.1-.23.23-.23h1.4zm-3.86.01c.01 0 .01 0 .01-.01.13 0 .22.1.22.22v7.55c0 .12-.1.23-.23.23h-1.4c-.13 0-.23-.1-.23-.23V15c-.7.76-1.69 1.19-2.73 1.19-2.17 0-3.94-1.87-3.94-4.19 0-2.32 1.77-4.19 3.94-4.19 1.03 0 2.02.43 2.73 1.18v-.75c0-.12.1-.23.23-.23h1.4zm26.375-.19a4.24 4.24 0 00-4.16 3.29c-.13.59-.13 1.19 0 1.77a4.233 4.233 0 004.17 3.3c2.35 0 4.26-1.87 4.26-4.19 0-2.32-1.9-4.17-4.27-4.17zM60.63 5c.13 0 .23.1.23.23v3.76c.7-.76 1.7-1.18 2.73-1.18 1.88 0 3.45 1.4 3.84 3.28.13.59.13 1.2 0 1.8-.39 1.88-1.96 3.29-3.84 3.29-1.03 0-2.02-.43-2.73-1.18v.77c0 .12-.1.23-.23.23h-1.4c-.13 0-.23-.1-.23-.23V5.23c0-.12.1-.23.23-.23h1.4zm-34 11h-1.4c-.13 0-.23-.11-.23-.23V8.22c.01-.13.1-.22.23-.22h1.4c.13 0 .22.11.23.22v.68c.5-.68 1.3-1.09 2.16-1.1h.03c1.09 0 2.09.6 2.6 1.55.45-.95 1.4-1.55 2.44-1.56 1.62 0 2.93 1.25 2.9 2.78l.03 5.2c0 .13-.1.23-.23.23h-1.41c-.13 0-.23-.11-.23-.23v-4.59c0-.98-.74-1.71-1.62-1.71-.8 0-1.46.7-1.59 1.62l.01 4.68c0 .13-.11.23-.23.23h-1.41c-.13 0-.23-.11-.23-.23v-4.59c0-.98-.74-1.71-1.62-1.71-.85 0-1.54.79-1.6 1.8v4.5c0 .13-.1.23-.23.23zm53.615 0h-1.61c-.04 0-.08-.01-.12-.03-.09-.06-.13-.19-.06-.28l2.43-3.71-2.39-3.65a.213.213 0 01-.03-.12c0-.12.09-.21.21-.21h1.61c.13 0 .24.06.3.17l1.41 2.37 1.4-2.37a.34.34 0 01.3-.17h1.6c.04 0 .08.01.12.03.09.06.13.19.06.28l-2.37 3.65 2.43 3.7c0 .05.01.09.01.13 0 .12-.09.21-.21.21h-1.61c-.13 0-.24-.06-.3-.17l-1.44-2.42-1.44 2.42a.34.34 0 01-.3.17zm-7.12-1.49c-1.33 0-2.42-1.12-2.42-2.51 0-1.39 1.08-2.52 2.42-2.52 1.33 0 2.42 1.12 2.42 2.51 0 1.39-1.08 2.51-2.42 2.52zm-19.865 0c-1.32 0-2.39-1.11-2.42-2.48v-.07c.02-1.38 1.09-2.49 2.4-2.49 1.32 0 2.41 1.12 2.41 2.51 0 1.39-1.07 2.52-2.39 2.53zm-8.11-2.48c-.01 1.37-1.09 2.47-2.41 2.47s-2.42-1.12-2.42-2.51c0-1.39 1.08-2.52 2.4-2.52 1.33 0 2.39 1.11 2.41 2.48l.02.08zm18.12 2.47c-1.32 0-2.39-1.11-2.41-2.48v-.06c.02-1.38 1.09-2.48 2.41-2.48s2.42 1.12 2.42 2.51c0 1.39-1.09 2.51-2.42 2.51z'/%3E%3C/defs%3E%3Cmask id='clip'%3E%3Crect x='0' y='0' width='100%25' height='100%25' fill='white'/%3E%3Cuse xlink:href='%23logo'/%3E%3Cuse xlink:href='%23text'/%3E%3C/mask%3E%3Cg id='outline' opacity='1' stroke='%23fff' stroke-width='3' fill='%23fff'%3E%3Ccircle mask='url(%23clip)' cx='11.5' cy='11.5' r='9.25'/%3E%3Cuse xlink:href='%23text' mask='url(%23clip)'/%3E%3C/g%3E%3Cg id='fill' opacity='1' fill='%23000'%3E%3Cuse xlink:href='%23logo'/%3E%3Cuse xlink:href='%23text'/%3E%3C/g%3E%3C/svg%3E\");\n }\n }\n .mapboxgl-ctrl.mapboxgl-ctrl-attrib {\n background-color: hsla(0, 0%, 100%, 0.5);\n margin: 0;\n padding: 0 5px;\n }\n @media screen {\n .mapboxgl-ctrl-attrib.mapboxgl-compact {\n background-color: #fff;\n border-radius: 12px;\n margin: 10px;\n min-height: 20px;\n padding: 2px 24px 2px 0;\n position: relative;\n }\n .mapboxgl-ctrl-attrib.mapboxgl-compact-show {\n padding: 2px 28px 2px 8px;\n visibility: visible;\n }\n .mapboxgl-ctrl-bottom-left > .mapboxgl-ctrl-attrib.mapboxgl-compact-show,\n .mapboxgl-ctrl-top-left > .mapboxgl-ctrl-attrib.mapboxgl-compact-show {\n border-radius: 12px;\n padding: 2px 8px 2px 28px;\n }\n .mapboxgl-ctrl-attrib.mapboxgl-compact .mapboxgl-ctrl-attrib-inner {\n display: none;\n }\n .mapboxgl-ctrl-attrib-button {\n background-color: hsla(0, 0%, 100%, 0.5);\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill-rule='evenodd'%3E%3Cpath d='M4 10a6 6 0 1 0 12 0 6 6 0 1 0-12 0m5-3a1 1 0 1 0 2 0 1 1 0 1 0-2 0m0 3a1 1 0 1 1 2 0v3a1 1 0 1 1-2 0'/%3E%3C/svg%3E\");\n border: 0;\n border-radius: 12px;\n box-sizing: border-box;\n cursor: pointer;\n display: none;\n height: 24px;\n outline: none;\n position: absolute;\n right: 0;\n top: 0;\n width: 24px;\n }\n .mapboxgl-ctrl-bottom-left .mapboxgl-ctrl-attrib-button,\n .mapboxgl-ctrl-top-left .mapboxgl-ctrl-attrib-button {\n left: 0;\n }\n .mapboxgl-ctrl-attrib.mapboxgl-compact .mapboxgl-ctrl-attrib-button,\n .mapboxgl-ctrl-attrib.mapboxgl-compact-show .mapboxgl-ctrl-attrib-inner {\n display: block;\n }\n .mapboxgl-ctrl-attrib.mapboxgl-compact-show .mapboxgl-ctrl-attrib-button {\n background-color: rgb(0 0 0/5%);\n }\n .mapboxgl-ctrl-bottom-right > .mapboxgl-ctrl-attrib.mapboxgl-compact:after {\n bottom: 0;\n right: 0;\n }\n .mapboxgl-ctrl-top-right > .mapboxgl-ctrl-attrib.mapboxgl-compact:after {\n right: 0;\n top: 0;\n }\n .mapboxgl-ctrl-top-left > .mapboxgl-ctrl-attrib.mapboxgl-compact:after {\n left: 0;\n top: 0;\n }\n .mapboxgl-ctrl-bottom-left > .mapboxgl-ctrl-attrib.mapboxgl-compact:after {\n bottom: 0;\n left: 0;\n }\n }\n @media screen and (-ms-high-contrast: active) {\n .mapboxgl-ctrl-attrib.mapboxgl-compact:after {\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill-rule='evenodd' fill='%23fff'%3E%3Cpath d='M4 10a6 6 0 1 0 12 0 6 6 0 1 0-12 0m5-3a1 1 0 1 0 2 0 1 1 0 1 0-2 0m0 3a1 1 0 1 1 2 0v3a1 1 0 1 1-2 0'/%3E%3C/svg%3E\");\n }\n }\n @media screen and (-ms-high-contrast: black-on-white) {\n .mapboxgl-ctrl-attrib.mapboxgl-compact:after {\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill-rule='evenodd'%3E%3Cpath d='M4 10a6 6 0 1 0 12 0 6 6 0 1 0-12 0m5-3a1 1 0 1 0 2 0 1 1 0 1 0-2 0m0 3a1 1 0 1 1 2 0v3a1 1 0 1 1-2 0'/%3E%3C/svg%3E\");\n }\n }\n .mapboxgl-ctrl-attrib a {\n color: rgba(0, 0, 0, 0.75);\n text-decoration: none;\n }\n .mapboxgl-ctrl-attrib a:hover {\n color: inherit;\n text-decoration: underline;\n }\n .mapboxgl-ctrl-attrib .mapbox-improve-map {\n font-weight: 700;\n margin-left: 2px;\n }\n .mapboxgl-attrib-empty {\n display: none;\n }\n .mapboxgl-ctrl-scale {\n background-color: hsla(0, 0%, 100%, 0.75);\n border: 2px solid #333;\n border-top: #333;\n box-sizing: border-box;\n color: #333;\n font-size: 10px;\n padding: 0 5px;\n white-space: nowrap;\n }\n .mapboxgl-popup {\n display: flex;\n left: 0;\n pointer-events: none;\n position: absolute;\n top: 0;\n will-change: transform;\n }\n .mapboxgl-popup-anchor-top,\n .mapboxgl-popup-anchor-top-left,\n .mapboxgl-popup-anchor-top-right {\n flex-direction: column;\n }\n .mapboxgl-popup-anchor-bottom,\n .mapboxgl-popup-anchor-bottom-left,\n .mapboxgl-popup-anchor-bottom-right {\n flex-direction: column-reverse;\n }\n .mapboxgl-popup-anchor-left {\n flex-direction: row;\n }\n .mapboxgl-popup-anchor-right {\n flex-direction: row-reverse;\n }\n .mapboxgl-popup-tip {\n border: 10px solid transparent;\n height: 0;\n width: 0;\n z-index: 1;\n }\n .mapboxgl-popup-anchor-top .mapboxgl-popup-tip {\n align-self: center;\n border-bottom-color: #fff;\n border-top: none;\n }\n .mapboxgl-popup-anchor-top-left .mapboxgl-popup-tip {\n align-self: flex-start;\n border-bottom-color: #fff;\n border-left: none;\n border-top: none;\n }\n .mapboxgl-popup-anchor-top-right .mapboxgl-popup-tip {\n align-self: flex-end;\n border-bottom-color: #fff;\n border-right: none;\n border-top: none;\n }\n .mapboxgl-popup-anchor-bottom .mapboxgl-popup-tip {\n align-self: center;\n border-bottom: none;\n border-top-color: #fff;\n }\n .mapboxgl-popup-anchor-bottom-left .mapboxgl-popup-tip {\n align-self: flex-start;\n border-bottom: none;\n border-left: none;\n border-top-color: #fff;\n }\n .mapboxgl-popup-anchor-bottom-right .mapboxgl-popup-tip {\n align-self: flex-end;\n border-bottom: none;\n border-right: none;\n border-top-color: #fff;\n }\n .mapboxgl-popup-anchor-left .mapboxgl-popup-tip {\n align-self: center;\n border-left: none;\n border-right-color: #fff;\n }\n .mapboxgl-popup-anchor-right .mapboxgl-popup-tip {\n align-self: center;\n border-left-color: #fff;\n border-right: none;\n }\n .mapboxgl-popup-close-button {\n background-color: transparent;\n border: 0;\n border-radius: 0 3px 0 0;\n cursor: pointer;\n position: absolute;\n right: 0;\n top: 0;\n }\n .mapboxgl-popup-close-button:hover {\n background-color: rgb(0 0 0/5%);\n }\n .mapboxgl-popup-content {\n background: #fff;\n border-radius: 3px;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1);\n padding: 10px 10px 15px;\n pointer-events: auto;\n position: relative;\n }\n .mapboxgl-popup-anchor-top-left .mapboxgl-popup-content {\n border-top-left-radius: 0;\n }\n .mapboxgl-popup-anchor-top-right .mapboxgl-popup-content {\n border-top-right-radius: 0;\n }\n .mapboxgl-popup-anchor-bottom-left .mapboxgl-popup-content {\n border-bottom-left-radius: 0;\n }\n .mapboxgl-popup-anchor-bottom-right .mapboxgl-popup-content {\n border-bottom-right-radius: 0;\n }\n .mapboxgl-popup-track-pointer {\n display: none;\n }\n .mapboxgl-popup-track-pointer * {\n pointer-events: none;\n user-select: none;\n }\n .mapboxgl-map:hover .mapboxgl-popup-track-pointer {\n display: flex;\n }\n .mapboxgl-map:active .mapboxgl-popup-track-pointer {\n display: none;\n }\n .mapboxgl-marker {\n left: 0;\n opacity: 1;\n position: absolute;\n top: 0;\n transition: opacity 0.2s;\n will-change: transform;\n }\n .mapboxgl-user-location-dot,\n .mapboxgl-user-location-dot:before {\n background-color: #1da1f2;\n border-radius: 50%;\n height: 15px;\n width: 15px;\n }\n .mapboxgl-user-location-dot:before {\n animation: mapboxgl-user-location-dot-pulse 2s infinite;\n content: '';\n position: absolute;\n }\n .mapboxgl-user-location-dot:after {\n border: 2px solid #fff;\n border-radius: 50%;\n box-shadow: 0 0 3px rgba(0, 0, 0, 0.35);\n box-sizing: border-box;\n content: '';\n height: 19px;\n left: -2px;\n position: absolute;\n top: -2px;\n width: 19px;\n }\n .mapboxgl-user-location-show-heading .mapboxgl-user-location-heading {\n height: 0;\n width: 0;\n }\n .mapboxgl-user-location-show-heading .mapboxgl-user-location-heading:after,\n .mapboxgl-user-location-show-heading .mapboxgl-user-location-heading:before {\n border-bottom: 7.5px solid #4aa1eb;\n content: '';\n position: absolute;\n }\n .mapboxgl-user-location-show-heading .mapboxgl-user-location-heading:before {\n border-left: 7.5px solid transparent;\n transform: translateY(-28px) skewY(-20deg);\n }\n .mapboxgl-user-location-show-heading .mapboxgl-user-location-heading:after {\n border-right: 7.5px solid transparent;\n transform: translate(7.5px, -28px) skewY(20deg);\n }\n @keyframes mapboxgl-user-location-dot-pulse {\n 0% {\n opacity: 1;\n transform: scale(1);\n }\n 70% {\n opacity: 0;\n transform: scale(3);\n }\n to {\n opacity: 0;\n transform: scale(1);\n }\n }\n .mapboxgl-user-location-dot-stale {\n background-color: #aaa;\n }\n .mapboxgl-user-location-dot-stale:after {\n display: none;\n }\n .mapboxgl-user-location-accuracy-circle {\n background-color: #1da1f233;\n border-radius: 100%;\n height: 1px;\n width: 1px;\n }\n .mapboxgl-crosshair,\n .mapboxgl-crosshair .mapboxgl-interactive,\n .mapboxgl-crosshair .mapboxgl-interactive:active {\n cursor: crosshair;\n }\n .mapboxgl-boxzoom {\n background: #fff;\n border: 2px dotted #202020;\n height: 0;\n left: 0;\n opacity: 0.5;\n position: absolute;\n top: 0;\n width: 0;\n }\n @media print {\n .mapbox-improve-map {\n display: none;\n }\n }\n .mapboxgl-scroll-zoom-blocker,\n .mapboxgl-touch-pan-blocker {\n align-items: center;\n background: rgba(0, 0, 0, 0.7);\n color: #fff;\n display: flex;\n font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Helvetica, Arial,\n sans-serif;\n height: 100%;\n justify-content: center;\n left: 0;\n opacity: 0;\n pointer-events: none;\n position: absolute;\n text-align: center;\n top: 0;\n transition: opacity 0.75s ease-in-out;\n transition-delay: 1s;\n width: 100%;\n }\n .mapboxgl-scroll-zoom-blocker-show,\n .mapboxgl-touch-pan-blocker-show {\n opacity: 1;\n transition: opacity 0.1s ease-in-out;\n }\n .mapboxgl-canvas-container.mapboxgl-touch-pan-blocker-override.mapboxgl-scrollable-page,\n .mapboxgl-canvas-container.mapboxgl-touch-pan-blocker-override.mapboxgl-scrollable-page\n .mapboxgl-canvas {\n touch-action: pan-x pan-y;\n }\n"])));
3681
3702
 
3682
- var MinimalProviders = function MinimalProviders(_ref) {
3683
- var children = _ref.children,
3684
- locale = _ref.locale;
3685
- return React__default.default.createElement(reactIntl.IntlProvider, {
3686
- messages: getMessages(locale),
3687
- locale: locale
3688
- }, React__default.default.createElement(boemly.BoemlyThemeProvider, {
3689
- fonts: FONT_CUSTOMIZATIONS
3690
- }, children));
3691
- };
3703
+ var getFpmProjectsByBbox = /*#__PURE__*/function () {
3704
+ var _ref = /*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee(bbox, preview) {
3705
+ var _bbox$split$map, west, south, east, north, cache, fpmResponse;
3706
+ return _regeneratorRuntime().wrap(function _callee$(_context) {
3707
+ while (1) switch (_context.prev = _context.next) {
3708
+ case 0:
3709
+ if (preview === void 0) {
3710
+ preview = false;
3711
+ }
3712
+ _bbox$split$map = bbox.split(',').map(Number), west = _bbox$split$map[0], south = _bbox$split$map[1], east = _bbox$split$map[2], north = _bbox$split$map[3];
3713
+ cache = preview ? false : undefined;
3714
+ _context.next = 5;
3715
+ return fpmClient.get('/public/projects', {
3716
+ params: {
3717
+ bbox: west + "," + south + "," + east + "," + north
3718
+ },
3719
+ cache: cache
3720
+ });
3721
+ case 5:
3722
+ fpmResponse = _context.sent;
3723
+ return _context.abrupt("return", fpmResponse.data);
3724
+ case 7:
3725
+ case "end":
3726
+ return _context.stop();
3727
+ }
3728
+ }, _callee);
3729
+ }));
3730
+ return function getFpmProjectsByBbox(_x, _x2) {
3731
+ return _ref.apply(this, arguments);
3732
+ };
3733
+ }();
3692
3734
 
3693
- var MapMarker = function MapMarker(_ref) {
3694
- var title = _ref.title,
3695
- projectDeveloper = _ref.projectDeveloper,
3696
- slug = _ref.slug,
3697
- creditAvailability = _ref.creditAvailability,
3698
- _ref$portfolioHost = _ref.portfolioHost,
3699
- portfolioHost = _ref$portfolioHost === void 0 ? '' : _ref$portfolioHost,
3700
- _ref$isPublic = _ref.isPublic,
3701
- isPublic = _ref$isPublic === void 0 ? false : _ref$isPublic;
3702
- var _useContext = React.useContext(IntlContext),
3703
- formatMessage = _useContext.formatMessage;
3704
- var _useDisclosure = boemly.useDisclosure(),
3705
- isOpen = _useDisclosure.isOpen,
3706
- onOpen = _useDisclosure.onOpen,
3707
- onClose = _useDisclosure.onClose;
3708
- var blue600 = boemly.useToken('colors', 'blue.600');
3709
- return React__default.default.createElement(boemly.Flex, {
3710
- position: "absolute",
3711
- gap: "4",
3712
- onMouseEnter: onOpen,
3713
- onMouseLeave: onClose,
3714
- cursor: "grab"
3715
- }, React__default.default.createElement(boemly.Box, {
3716
- as: slug ? Link__default.default : undefined,
3717
- href: slug && portfolioHost + "/portfolio/" + slug
3718
- }, React__default.default.createElement(react.MapPin, {
3719
- size: "40px",
3720
- color: blue600,
3721
- weight: "fill",
3722
- "data-testid": "mapmarker-pin",
3723
- filter: "drop-shadow(0px 0px 2px #FFF)"
3724
- })), isPublic && isOpen && React__default.default.createElement(boemly.Container, {
3725
- shadow: "md",
3726
- width: "max-content",
3727
- minWidth: "3xs",
3728
- maxWidth: ['3xs', null, null, 'sm']
3729
- }, React__default.default.createElement(boemly.Flex, {
3730
- direction: "column"
3731
- }, React__default.default.createElement(CreditsAvailableBadge, {
3732
- status: creditAvailability,
3733
- href: slug && portfolioHost + "/portfolio/" + slug
3734
- }), React__default.default.createElement(boemly.Heading, {
3735
- mt: "3",
3736
- size: "md"
3737
- }, title), projectDeveloper && React__default.default.createElement(boemly.Text, {
3738
- size: "smLowNormal",
3739
- mt: "1"
3740
- }, projectDeveloper), slug && React__default.default.createElement(boemly.Button, {
3741
- width: "fit-content",
3742
- variant: "outline",
3743
- size: "sm",
3744
- as: Link__default.default,
3745
- href: portfolioHost + "/portfolio/" + slug,
3746
- mt: "4",
3747
- whiteSpace: "nowrap"
3748
- }, formatMessage({
3749
- id: 'sections.projectsMap.link.text'
3750
- })))));
3735
+ var mergeProjectData = function mergeProjectData(featureCollection, strapiProjects) {
3736
+ // Add slug and portfolioHost to each feature's properties if we have Strapi data
3737
+ var mergedFeatureCollection = _extends({}, featureCollection, {
3738
+ features: featureCollection.features.map(function (feature) {
3739
+ var _feature$properties;
3740
+ var fpmProjectId = (_feature$properties = feature.properties) == null ? void 0 : _feature$properties.id;
3741
+ var strapiProject = fpmProjectId ? strapiProjects.get(fpmProjectId) : null;
3742
+ if (strapiProject) {
3743
+ var _strapiProject$attrib;
3744
+ feature.properties = _extends({}, feature.properties, {
3745
+ slug: strapiProject.attributes.slug || undefined,
3746
+ portfolioHost: ((_strapiProject$attrib = strapiProject.attributes.portfolio) == null || (_strapiProject$attrib = _strapiProject$attrib.data) == null ? void 0 : _strapiProject$attrib.attributes.host) || undefined
3747
+ });
3748
+ }
3749
+ return feature;
3750
+ })
3751
+ });
3752
+ return mergedFeatureCollection;
3751
3753
  };
3752
3754
 
3753
- var _templateObject$4;
3754
- var mapboxStyle = /*#__PURE__*/react$1.css(_templateObject$4 || (_templateObject$4 = /*#__PURE__*/_taggedTemplateLiteralLoose(["\n .mapboxgl-map {\n -webkit-tap-highlight-color: rgb(0 0 0/0);\n font: 12px/20px Helvetica Neue, Arial, Helvetica, sans-serif;\n overflow: hidden;\n position: relative;\n }\n .mapboxgl-canvas {\n left: 0;\n position: absolute;\n top: 0;\n }\n .mapboxgl-map:-webkit-full-screen {\n height: 100%;\n width: 100%;\n }\n .mapboxgl-canary {\n background-color: salmon;\n }\n .mapboxgl-canvas-container.mapboxgl-interactive,\n .mapboxgl-ctrl-group button.mapboxgl-ctrl-compass {\n cursor: grab;\n -webkit-user-select: none;\n user-select: none;\n }\n .mapboxgl-canvas-container.mapboxgl-interactive.mapboxgl-track-pointer {\n cursor: pointer;\n }\n .mapboxgl-canvas-container.mapboxgl-interactive:active,\n .mapboxgl-ctrl-group button.mapboxgl-ctrl-compass:active {\n cursor: grabbing;\n }\n .mapboxgl-canvas-container.mapboxgl-touch-zoom-rotate,\n .mapboxgl-canvas-container.mapboxgl-touch-zoom-rotate .mapboxgl-canvas {\n touch-action: pan-x pan-y;\n }\n .mapboxgl-canvas-container.mapboxgl-touch-drag-pan,\n .mapboxgl-canvas-container.mapboxgl-touch-drag-pan .mapboxgl-canvas {\n touch-action: pinch-zoom;\n }\n .mapboxgl-canvas-container.mapboxgl-touch-zoom-rotate.mapboxgl-touch-drag-pan,\n .mapboxgl-canvas-container.mapboxgl-touch-zoom-rotate.mapboxgl-touch-drag-pan\n .mapboxgl-canvas {\n touch-action: none;\n }\n .mapboxgl-ctrl-bottom-left,\n .mapboxgl-ctrl-bottom-right,\n .mapboxgl-ctrl-top-left,\n .mapboxgl-ctrl-top-right {\n pointer-events: none;\n position: absolute;\n z-index: 2;\n }\n .mapboxgl-ctrl-top-left {\n left: 0;\n top: 0;\n }\n .mapboxgl-ctrl-top-right {\n right: 0;\n top: 0;\n }\n .mapboxgl-ctrl-bottom-left {\n bottom: 0;\n left: 0;\n }\n .mapboxgl-ctrl-bottom-right {\n bottom: 0;\n right: 0;\n }\n .mapboxgl-ctrl {\n clear: both;\n pointer-events: auto;\n transform: translate(0);\n }\n .mapboxgl-ctrl-top-left .mapboxgl-ctrl {\n float: left;\n margin: 10px 0 0 10px;\n }\n .mapboxgl-ctrl-top-right .mapboxgl-ctrl {\n float: right;\n margin: 10px 10px 0 0;\n }\n .mapboxgl-ctrl-bottom-left .mapboxgl-ctrl {\n float: left;\n margin: 0 0 10px 10px;\n }\n .mapboxgl-ctrl-bottom-right .mapboxgl-ctrl {\n float: right;\n margin: 0 10px 10px 0;\n }\n .mapboxgl-ctrl-group {\n background: #fff;\n border-radius: 4px;\n }\n .mapboxgl-ctrl-group:not(:empty) {\n box-shadow: 0 0 0 2px rgba(0, 0, 0, 0.1);\n }\n @media (-ms-high-contrast: active) {\n .mapboxgl-ctrl-group:not(:empty) {\n box-shadow: 0 0 0 2px ButtonText;\n }\n }\n .mapboxgl-ctrl-group button {\n background-color: transparent;\n border: 0;\n box-sizing: border-box;\n cursor: pointer;\n display: block;\n height: 29px;\n outline: none;\n overflow: hidden;\n padding: 0;\n width: 29px;\n }\n .mapboxgl-ctrl-group button + button {\n border-top: 1px solid #ddd;\n }\n .mapboxgl-ctrl button .mapboxgl-ctrl-icon {\n background-position: 50%;\n background-repeat: no-repeat;\n display: block;\n height: 100%;\n width: 100%;\n }\n @media (-ms-high-contrast: active) {\n .mapboxgl-ctrl-icon {\n background-color: transparent;\n }\n .mapboxgl-ctrl-group button + button {\n border-top: 1px solid ButtonText;\n }\n }\n .mapboxgl-ctrl-attrib-button:focus,\n .mapboxgl-ctrl-group button:focus {\n box-shadow: 0 0 2px 2px #0096ff;\n }\n .mapboxgl-ctrl button:disabled {\n cursor: not-allowed;\n }\n .mapboxgl-ctrl button:disabled .mapboxgl-ctrl-icon {\n opacity: 0.25;\n }\n .mapboxgl-ctrl-group button:first-of-type {\n border-radius: 4px 4px 0 0;\n }\n .mapboxgl-ctrl-group button:last-of-type {\n border-radius: 0 0 4px 4px;\n }\n .mapboxgl-ctrl-group button:only-of-type {\n border-radius: inherit;\n }\n .mapboxgl-ctrl button:not(:disabled):hover {\n background-color: rgb(0 0 0/5%);\n }\n .mapboxgl-ctrl-group button:focus:focus-visible {\n box-shadow: 0 0 2px 2px #0096ff;\n }\n .mapboxgl-ctrl-group button:focus:not(:focus-visible) {\n box-shadow: none;\n }\n .mapboxgl-ctrl button.mapboxgl-ctrl-zoom-out .mapboxgl-ctrl-icon {\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23333' viewBox='0 0 29 29'%3E%3Cpath d='M10 13c-.75 0-1.5.75-1.5 1.5S9.25 16 10 16h9c.75 0 1.5-.75 1.5-1.5S19.75 13 19 13h-9z'/%3E%3C/svg%3E\");\n }\n .mapboxgl-ctrl button.mapboxgl-ctrl-zoom-in .mapboxgl-ctrl-icon {\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23333' viewBox='0 0 29 29'%3E%3Cpath d='M14.5 8.5c-.75 0-1.5.75-1.5 1.5v3h-3c-.75 0-1.5.75-1.5 1.5S9.25 16 10 16h3v3c0 .75.75 1.5 1.5 1.5S16 19.75 16 19v-3h3c.75 0 1.5-.75 1.5-1.5S19.75 13 19 13h-3v-3c0-.75-.75-1.5-1.5-1.5z'/%3E%3C/svg%3E\");\n }\n @media (-ms-high-contrast: active) {\n .mapboxgl-ctrl button.mapboxgl-ctrl-zoom-out .mapboxgl-ctrl-icon {\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 29 29'%3E%3Cpath d='M10 13c-.75 0-1.5.75-1.5 1.5S9.25 16 10 16h9c.75 0 1.5-.75 1.5-1.5S19.75 13 19 13h-9z'/%3E%3C/svg%3E\");\n }\n .mapboxgl-ctrl button.mapboxgl-ctrl-zoom-in .mapboxgl-ctrl-icon {\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 29 29'%3E%3Cpath d='M14.5 8.5c-.75 0-1.5.75-1.5 1.5v3h-3c-.75 0-1.5.75-1.5 1.5S9.25 16 10 16h3v3c0 .75.75 1.5 1.5 1.5S16 19.75 16 19v-3h3c.75 0 1.5-.75 1.5-1.5S19.75 13 19 13h-3v-3c0-.75-.75-1.5-1.5-1.5z'/%3E%3C/svg%3E\");\n }\n }\n @media (-ms-high-contrast: black-on-white) {\n .mapboxgl-ctrl button.mapboxgl-ctrl-zoom-out .mapboxgl-ctrl-icon {\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23000' viewBox='0 0 29 29'%3E%3Cpath d='M10 13c-.75 0-1.5.75-1.5 1.5S9.25 16 10 16h9c.75 0 1.5-.75 1.5-1.5S19.75 13 19 13h-9z'/%3E%3C/svg%3E\");\n }\n .mapboxgl-ctrl button.mapboxgl-ctrl-zoom-in .mapboxgl-ctrl-icon {\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23000' viewBox='0 0 29 29'%3E%3Cpath d='M14.5 8.5c-.75 0-1.5.75-1.5 1.5v3h-3c-.75 0-1.5.75-1.5 1.5S9.25 16 10 16h3v3c0 .75.75 1.5 1.5 1.5S16 19.75 16 19v-3h3c.75 0 1.5-.75 1.5-1.5S19.75 13 19 13h-3v-3c0-.75-.75-1.5-1.5-1.5z'/%3E%3C/svg%3E\");\n }\n }\n .mapboxgl-ctrl button.mapboxgl-ctrl-fullscreen .mapboxgl-ctrl-icon {\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23333' viewBox='0 0 29 29'%3E%3Cpath d='M24 16v5.5c0 1.75-.75 2.5-2.5 2.5H16v-1l3-1.5-4-5.5 1-1 5.5 4 1.5-3h1zM6 16l1.5 3 5.5-4 1 1-4 5.5 3 1.5v1H7.5C5.75 24 5 23.25 5 21.5V16h1zm7-11v1l-3 1.5 4 5.5-1 1-5.5-4L6 13H5V7.5C5 5.75 5.75 5 7.5 5H13zm11 2.5c0-1.75-.75-2.5-2.5-2.5H16v1l3 1.5-4 5.5 1 1 5.5-4 1.5 3h1V7.5z'/%3E%3C/svg%3E\");\n }\n .mapboxgl-ctrl button.mapboxgl-ctrl-shrink .mapboxgl-ctrl-icon {\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 29 29'%3E%3Cpath d='M18.5 16c-1.75 0-2.5.75-2.5 2.5V24h1l1.5-3 5.5 4 1-1-4-5.5 3-1.5v-1h-5.5zM13 18.5c0-1.75-.75-2.5-2.5-2.5H5v1l3 1.5L4 24l1 1 5.5-4 1.5 3h1v-5.5zm3-8c0 1.75.75 2.5 2.5 2.5H24v-1l-3-1.5L25 5l-1-1-5.5 4L17 5h-1v5.5zM10.5 13c1.75 0 2.5-.75 2.5-2.5V5h-1l-1.5 3L5 4 4 5l4 5.5L5 12v1h5.5z'/%3E%3C/svg%3E\");\n }\n @media (-ms-high-contrast: active) {\n .mapboxgl-ctrl button.mapboxgl-ctrl-fullscreen .mapboxgl-ctrl-icon {\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 29 29'%3E%3Cpath d='M24 16v5.5c0 1.75-.75 2.5-2.5 2.5H16v-1l3-1.5-4-5.5 1-1 5.5 4 1.5-3h1zM6 16l1.5 3 5.5-4 1 1-4 5.5 3 1.5v1H7.5C5.75 24 5 23.25 5 21.5V16h1zm7-11v1l-3 1.5 4 5.5-1 1-5.5-4L6 13H5V7.5C5 5.75 5.75 5 7.5 5H13zm11 2.5c0-1.75-.75-2.5-2.5-2.5H16v1l3 1.5-4 5.5 1 1 5.5-4 1.5 3h1V7.5z'/%3E%3C/svg%3E\");\n }\n .mapboxgl-ctrl button.mapboxgl-ctrl-shrink .mapboxgl-ctrl-icon {\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 29 29'%3E%3Cpath d='M18.5 16c-1.75 0-2.5.75-2.5 2.5V24h1l1.5-3 5.5 4 1-1-4-5.5 3-1.5v-1h-5.5zM13 18.5c0-1.75-.75-2.5-2.5-2.5H5v1l3 1.5L4 24l1 1 5.5-4 1.5 3h1v-5.5zm3-8c0 1.75.75 2.5 2.5 2.5H24v-1l-3-1.5L25 5l-1-1-5.5 4L17 5h-1v5.5zM10.5 13c1.75 0 2.5-.75 2.5-2.5V5h-1l-1.5 3L5 4 4 5l4 5.5L5 12v1h5.5z'/%3E%3C/svg%3E\");\n }\n }\n @media (-ms-high-contrast: black-on-white) {\n .mapboxgl-ctrl button.mapboxgl-ctrl-fullscreen .mapboxgl-ctrl-icon {\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23000' viewBox='0 0 29 29'%3E%3Cpath d='M24 16v5.5c0 1.75-.75 2.5-2.5 2.5H16v-1l3-1.5-4-5.5 1-1 5.5 4 1.5-3h1zM6 16l1.5 3 5.5-4 1 1-4 5.5 3 1.5v1H7.5C5.75 24 5 23.25 5 21.5V16h1zm7-11v1l-3 1.5 4 5.5-1 1-5.5-4L6 13H5V7.5C5 5.75 5.75 5 7.5 5H13zm11 2.5c0-1.75-.75-2.5-2.5-2.5H16v1l3 1.5-4 5.5 1 1 5.5-4 1.5 3h1V7.5z'/%3E%3C/svg%3E\");\n }\n .mapboxgl-ctrl button.mapboxgl-ctrl-shrink .mapboxgl-ctrl-icon {\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23000' viewBox='0 0 29 29'%3E%3Cpath d='M18.5 16c-1.75 0-2.5.75-2.5 2.5V24h1l1.5-3 5.5 4 1-1-4-5.5 3-1.5v-1h-5.5zM13 18.5c0-1.75-.75-2.5-2.5-2.5H5v1l3 1.5L4 24l1 1 5.5-4 1.5 3h1v-5.5zm3-8c0 1.75.75 2.5 2.5 2.5H24v-1l-3-1.5L25 5l-1-1-5.5 4L17 5h-1v5.5zM10.5 13c1.75 0 2.5-.75 2.5-2.5V5h-1l-1.5 3L5 4 4 5l4 5.5L5 12v1h5.5z'/%3E%3C/svg%3E\");\n }\n }\n .mapboxgl-ctrl button.mapboxgl-ctrl-compass .mapboxgl-ctrl-icon {\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23333' viewBox='0 0 29 29'%3E%3Cpath d='M10.5 14l4-8 4 8h-8z'/%3E%3Cpath id='south' d='M10.5 16l4 8 4-8h-8z' fill='%23ccc'/%3E%3C/svg%3E\");\n }\n @media (-ms-high-contrast: active) {\n .mapboxgl-ctrl button.mapboxgl-ctrl-compass .mapboxgl-ctrl-icon {\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 29 29'%3E%3Cpath d='M10.5 14l4-8 4 8h-8z'/%3E%3Cpath id='south' d='M10.5 16l4 8 4-8h-8z' fill='%23999'/%3E%3C/svg%3E\");\n }\n }\n @media (-ms-high-contrast: black-on-white) {\n .mapboxgl-ctrl button.mapboxgl-ctrl-compass .mapboxgl-ctrl-icon {\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23000' viewBox='0 0 29 29'%3E%3Cpath d='M10.5 14l4-8 4 8h-8z'/%3E%3Cpath id='south' d='M10.5 16l4 8 4-8h-8z' fill='%23ccc'/%3E%3C/svg%3E\");\n }\n }\n .mapboxgl-ctrl button.mapboxgl-ctrl-geolocate .mapboxgl-ctrl-icon {\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill='%23333'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7z'/%3E%3Ccircle id='dot' cx='10' cy='10' r='2'/%3E%3Cpath id='stroke' d='M14 5l1 1-9 9-1-1 9-9z' display='none'/%3E%3C/svg%3E\");\n }\n .mapboxgl-ctrl button.mapboxgl-ctrl-geolocate:disabled .mapboxgl-ctrl-icon {\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill='%23aaa'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7z'/%3E%3Ccircle id='dot' cx='10' cy='10' r='2'/%3E%3Cpath id='stroke' d='M14 5l1 1-9 9-1-1 9-9z' fill='%23f00'/%3E%3C/svg%3E\");\n }\n .mapboxgl-ctrl\n button.mapboxgl-ctrl-geolocate.mapboxgl-ctrl-geolocate-active\n .mapboxgl-ctrl-icon {\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill='%2333b5e5'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7z'/%3E%3Ccircle id='dot' cx='10' cy='10' r='2'/%3E%3Cpath id='stroke' d='M14 5l1 1-9 9-1-1 9-9z' display='none'/%3E%3C/svg%3E\");\n }\n .mapboxgl-ctrl\n button.mapboxgl-ctrl-geolocate.mapboxgl-ctrl-geolocate-active-error\n .mapboxgl-ctrl-icon {\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill='%23e58978'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7z'/%3E%3Ccircle id='dot' cx='10' cy='10' r='2'/%3E%3Cpath id='stroke' d='M14 5l1 1-9 9-1-1 9-9z' display='none'/%3E%3C/svg%3E\");\n }\n .mapboxgl-ctrl\n button.mapboxgl-ctrl-geolocate.mapboxgl-ctrl-geolocate-background\n .mapboxgl-ctrl-icon {\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill='%2333b5e5'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7z'/%3E%3Ccircle id='dot' cx='10' cy='10' r='2' display='none'/%3E%3Cpath id='stroke' d='M14 5l1 1-9 9-1-1 9-9z' display='none'/%3E%3C/svg%3E\");\n }\n .mapboxgl-ctrl\n button.mapboxgl-ctrl-geolocate.mapboxgl-ctrl-geolocate-background-error\n .mapboxgl-ctrl-icon {\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill='%23e54e33'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7z'/%3E%3Ccircle id='dot' cx='10' cy='10' r='2' display='none'/%3E%3Cpath id='stroke' d='M14 5l1 1-9 9-1-1 9-9z' display='none'/%3E%3C/svg%3E\");\n }\n .mapboxgl-ctrl\n button.mapboxgl-ctrl-geolocate.mapboxgl-ctrl-geolocate-waiting\n .mapboxgl-ctrl-icon {\n animation: mapboxgl-spin 2s linear infinite;\n }\n @media (-ms-high-contrast: active) {\n .mapboxgl-ctrl button.mapboxgl-ctrl-geolocate .mapboxgl-ctrl-icon {\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill='%23fff'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7z'/%3E%3Ccircle id='dot' cx='10' cy='10' r='2'/%3E%3Cpath id='stroke' d='M14 5l1 1-9 9-1-1 9-9z' display='none'/%3E%3C/svg%3E\");\n }\n .mapboxgl-ctrl button.mapboxgl-ctrl-geolocate:disabled .mapboxgl-ctrl-icon {\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill='%23999'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7z'/%3E%3Ccircle id='dot' cx='10' cy='10' r='2'/%3E%3Cpath id='stroke' d='M14 5l1 1-9 9-1-1 9-9z' fill='%23f00'/%3E%3C/svg%3E\");\n }\n .mapboxgl-ctrl\n button.mapboxgl-ctrl-geolocate.mapboxgl-ctrl-geolocate-active\n .mapboxgl-ctrl-icon {\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill='%2333b5e5'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7z'/%3E%3Ccircle id='dot' cx='10' cy='10' r='2'/%3E%3Cpath id='stroke' d='M14 5l1 1-9 9-1-1 9-9z' display='none'/%3E%3C/svg%3E\");\n }\n .mapboxgl-ctrl\n button.mapboxgl-ctrl-geolocate.mapboxgl-ctrl-geolocate-active-error\n .mapboxgl-ctrl-icon {\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill='%23e58978'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7z'/%3E%3Ccircle id='dot' cx='10' cy='10' r='2'/%3E%3Cpath id='stroke' d='M14 5l1 1-9 9-1-1 9-9z' display='none'/%3E%3C/svg%3E\");\n }\n .mapboxgl-ctrl\n button.mapboxgl-ctrl-geolocate.mapboxgl-ctrl-geolocate-background\n .mapboxgl-ctrl-icon {\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill='%2333b5e5'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7z'/%3E%3Ccircle id='dot' cx='10' cy='10' r='2' display='none'/%3E%3Cpath id='stroke' d='M14 5l1 1-9 9-1-1 9-9z' display='none'/%3E%3C/svg%3E\");\n }\n .mapboxgl-ctrl\n button.mapboxgl-ctrl-geolocate.mapboxgl-ctrl-geolocate-background-error\n .mapboxgl-ctrl-icon {\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill='%23e54e33'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7z'/%3E%3Ccircle id='dot' cx='10' cy='10' r='2' display='none'/%3E%3Cpath id='stroke' d='M14 5l1 1-9 9-1-1 9-9z' display='none'/%3E%3C/svg%3E\");\n }\n }\n @media (-ms-high-contrast: black-on-white) {\n .mapboxgl-ctrl button.mapboxgl-ctrl-geolocate .mapboxgl-ctrl-icon {\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill='%23000'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7z'/%3E%3Ccircle id='dot' cx='10' cy='10' r='2'/%3E%3Cpath id='stroke' d='M14 5l1 1-9 9-1-1 9-9z' display='none'/%3E%3C/svg%3E\");\n }\n .mapboxgl-ctrl button.mapboxgl-ctrl-geolocate:disabled .mapboxgl-ctrl-icon {\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill='%23666'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7z'/%3E%3Ccircle id='dot' cx='10' cy='10' r='2'/%3E%3Cpath id='stroke' d='M14 5l1 1-9 9-1-1 9-9z' fill='%23f00'/%3E%3C/svg%3E\");\n }\n }\n @keyframes mapboxgl-spin {\n 0% {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(1turn);\n }\n }\n a.mapboxgl-ctrl-logo {\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' fill-rule='evenodd' viewBox='0 0 88 23'%3E%3Cdefs%3E%3Cpath id='logo' d='M11.5 2.25c5.105 0 9.25 4.145 9.25 9.25s-4.145 9.25-9.25 9.25-9.25-4.145-9.25-9.25 4.145-9.25 9.25-9.25zM6.997 15.983c-.051-.338-.828-5.802 2.233-8.873a4.395 4.395 0 013.13-1.28c1.27 0 2.49.51 3.39 1.42.91.9 1.42 2.12 1.42 3.39 0 1.18-.449 2.301-1.28 3.13C12.72 16.93 7 16 7 16l-.003-.017zM15.3 10.5l-2 .8-.8 2-.8-2-2-.8 2-.8.8-2 .8 2 2 .8z'/%3E%3Cpath id='text' d='M50.63 8c.13 0 .23.1.23.23V9c.7-.76 1.7-1.18 2.73-1.18 2.17 0 3.95 1.85 3.95 4.17s-1.77 4.19-3.94 4.19c-1.04 0-2.03-.43-2.74-1.18v3.77c0 .13-.1.23-.23.23h-1.4c-.13 0-.23-.1-.23-.23V8.23c0-.12.1-.23.23-.23h1.4zm-3.86.01c.01 0 .01 0 .01-.01.13 0 .22.1.22.22v7.55c0 .12-.1.23-.23.23h-1.4c-.13 0-.23-.1-.23-.23V15c-.7.76-1.69 1.19-2.73 1.19-2.17 0-3.94-1.87-3.94-4.19 0-2.32 1.77-4.19 3.94-4.19 1.03 0 2.02.43 2.73 1.18v-.75c0-.12.1-.23.23-.23h1.4zm26.375-.19a4.24 4.24 0 00-4.16 3.29c-.13.59-.13 1.19 0 1.77a4.233 4.233 0 004.17 3.3c2.35 0 4.26-1.87 4.26-4.19 0-2.32-1.9-4.17-4.27-4.17zM60.63 5c.13 0 .23.1.23.23v3.76c.7-.76 1.7-1.18 2.73-1.18 1.88 0 3.45 1.4 3.84 3.28.13.59.13 1.2 0 1.8-.39 1.88-1.96 3.29-3.84 3.29-1.03 0-2.02-.43-2.73-1.18v.77c0 .12-.1.23-.23.23h-1.4c-.13 0-.23-.1-.23-.23V5.23c0-.12.1-.23.23-.23h1.4zm-34 11h-1.4c-.13 0-.23-.11-.23-.23V8.22c.01-.13.1-.22.23-.22h1.4c.13 0 .22.11.23.22v.68c.5-.68 1.3-1.09 2.16-1.1h.03c1.09 0 2.09.6 2.6 1.55.45-.95 1.4-1.55 2.44-1.56 1.62 0 2.93 1.25 2.9 2.78l.03 5.2c0 .13-.1.23-.23.23h-1.41c-.13 0-.23-.11-.23-.23v-4.59c0-.98-.74-1.71-1.62-1.71-.8 0-1.46.7-1.59 1.62l.01 4.68c0 .13-.11.23-.23.23h-1.41c-.13 0-.23-.11-.23-.23v-4.59c0-.98-.74-1.71-1.62-1.71-.85 0-1.54.79-1.6 1.8v4.5c0 .13-.1.23-.23.23zm53.615 0h-1.61c-.04 0-.08-.01-.12-.03-.09-.06-.13-.19-.06-.28l2.43-3.71-2.39-3.65a.213.213 0 01-.03-.12c0-.12.09-.21.21-.21h1.61c.13 0 .24.06.3.17l1.41 2.37 1.4-2.37a.34.34 0 01.3-.17h1.6c.04 0 .08.01.12.03.09.06.13.19.06.28l-2.37 3.65 2.43 3.7c0 .05.01.09.01.13 0 .12-.09.21-.21.21h-1.61c-.13 0-.24-.06-.3-.17l-1.44-2.42-1.44 2.42a.34.34 0 01-.3.17zm-7.12-1.49c-1.33 0-2.42-1.12-2.42-2.51 0-1.39 1.08-2.52 2.42-2.52 1.33 0 2.42 1.12 2.42 2.51 0 1.39-1.08 2.51-2.42 2.52zm-19.865 0c-1.32 0-2.39-1.11-2.42-2.48v-.07c.02-1.38 1.09-2.49 2.4-2.49 1.32 0 2.41 1.12 2.41 2.51 0 1.39-1.07 2.52-2.39 2.53zm-8.11-2.48c-.01 1.37-1.09 2.47-2.41 2.47s-2.42-1.12-2.42-2.51c0-1.39 1.08-2.52 2.4-2.52 1.33 0 2.39 1.11 2.41 2.48l.02.08zm18.12 2.47c-1.32 0-2.39-1.11-2.41-2.48v-.06c.02-1.38 1.09-2.48 2.41-2.48s2.42 1.12 2.42 2.51c0 1.39-1.09 2.51-2.42 2.51z'/%3E%3C/defs%3E%3Cmask id='clip'%3E%3Crect x='0' y='0' width='100%25' height='100%25' fill='white'/%3E%3Cuse xlink:href='%23logo'/%3E%3Cuse xlink:href='%23text'/%3E%3C/mask%3E%3Cg id='outline' opacity='0.3' stroke='%23000' stroke-width='3'%3E%3Ccircle mask='url(%23clip)' cx='11.5' cy='11.5' r='9.25'/%3E%3Cuse xlink:href='%23text' mask='url(%23clip)'/%3E%3C/g%3E%3Cg id='fill' opacity='0.9' fill='%23fff'%3E%3Cuse xlink:href='%23logo'/%3E%3Cuse xlink:href='%23text'/%3E%3C/g%3E%3C/svg%3E\");\n background-repeat: no-repeat;\n cursor: pointer;\n display: block;\n height: 23px;\n margin: 0 0 -4px -4px;\n overflow: hidden;\n width: 88px;\n }\n a.mapboxgl-ctrl-logo.mapboxgl-compact {\n width: 23px;\n }\n @media (-ms-high-contrast: active) {\n a.mapboxgl-ctrl-logo {\n background-color: transparent;\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' fill-rule='evenodd' viewBox='0 0 88 23'%3E%3Cdefs%3E%3Cpath id='logo' d='M11.5 2.25c5.105 0 9.25 4.145 9.25 9.25s-4.145 9.25-9.25 9.25-9.25-4.145-9.25-9.25 4.145-9.25 9.25-9.25zM6.997 15.983c-.051-.338-.828-5.802 2.233-8.873a4.395 4.395 0 013.13-1.28c1.27 0 2.49.51 3.39 1.42.91.9 1.42 2.12 1.42 3.39 0 1.18-.449 2.301-1.28 3.13C12.72 16.93 7 16 7 16l-.003-.017zM15.3 10.5l-2 .8-.8 2-.8-2-2-.8 2-.8.8-2 .8 2 2 .8z'/%3E%3Cpath id='text' d='M50.63 8c.13 0 .23.1.23.23V9c.7-.76 1.7-1.18 2.73-1.18 2.17 0 3.95 1.85 3.95 4.17s-1.77 4.19-3.94 4.19c-1.04 0-2.03-.43-2.74-1.18v3.77c0 .13-.1.23-.23.23h-1.4c-.13 0-.23-.1-.23-.23V8.23c0-.12.1-.23.23-.23h1.4zm-3.86.01c.01 0 .01 0 .01-.01.13 0 .22.1.22.22v7.55c0 .12-.1.23-.23.23h-1.4c-.13 0-.23-.1-.23-.23V15c-.7.76-1.69 1.19-2.73 1.19-2.17 0-3.94-1.87-3.94-4.19 0-2.32 1.77-4.19 3.94-4.19 1.03 0 2.02.43 2.73 1.18v-.75c0-.12.1-.23.23-.23h1.4zm26.375-.19a4.24 4.24 0 00-4.16 3.29c-.13.59-.13 1.19 0 1.77a4.233 4.233 0 004.17 3.3c2.35 0 4.26-1.87 4.26-4.19 0-2.32-1.9-4.17-4.27-4.17zM60.63 5c.13 0 .23.1.23.23v3.76c.7-.76 1.7-1.18 2.73-1.18 1.88 0 3.45 1.4 3.84 3.28.13.59.13 1.2 0 1.8-.39 1.88-1.96 3.29-3.84 3.29-1.03 0-2.02-.43-2.73-1.18v.77c0 .12-.1.23-.23.23h-1.4c-.13 0-.23-.1-.23-.23V5.23c0-.12.1-.23.23-.23h1.4zm-34 11h-1.4c-.13 0-.23-.11-.23-.23V8.22c.01-.13.1-.22.23-.22h1.4c.13 0 .22.11.23.22v.68c.5-.68 1.3-1.09 2.16-1.1h.03c1.09 0 2.09.6 2.6 1.55.45-.95 1.4-1.55 2.44-1.56 1.62 0 2.93 1.25 2.9 2.78l.03 5.2c0 .13-.1.23-.23.23h-1.41c-.13 0-.23-.11-.23-.23v-4.59c0-.98-.74-1.71-1.62-1.71-.8 0-1.46.7-1.59 1.62l.01 4.68c0 .13-.11.23-.23.23h-1.41c-.13 0-.23-.11-.23-.23v-4.59c0-.98-.74-1.71-1.62-1.71-.85 0-1.54.79-1.6 1.8v4.5c0 .13-.1.23-.23.23zm53.615 0h-1.61c-.04 0-.08-.01-.12-.03-.09-.06-.13-.19-.06-.28l2.43-3.71-2.39-3.65a.213.213 0 01-.03-.12c0-.12.09-.21.21-.21h1.61c.13 0 .24.06.3.17l1.41 2.37 1.4-2.37a.34.34 0 01.3-.17h1.6c.04 0 .08.01.12.03.09.06.13.19.06.28l-2.37 3.65 2.43 3.7c0 .05.01.09.01.13 0 .12-.09.21-.21.21h-1.61c-.13 0-.24-.06-.3-.17l-1.44-2.42-1.44 2.42a.34.34 0 01-.3.17zm-7.12-1.49c-1.33 0-2.42-1.12-2.42-2.51 0-1.39 1.08-2.52 2.42-2.52 1.33 0 2.42 1.12 2.42 2.51 0 1.39-1.08 2.51-2.42 2.52zm-19.865 0c-1.32 0-2.39-1.11-2.42-2.48v-.07c.02-1.38 1.09-2.49 2.4-2.49 1.32 0 2.41 1.12 2.41 2.51 0 1.39-1.07 2.52-2.39 2.53zm-8.11-2.48c-.01 1.37-1.09 2.47-2.41 2.47s-2.42-1.12-2.42-2.51c0-1.39 1.08-2.52 2.4-2.52 1.33 0 2.39 1.11 2.41 2.48l.02.08zm18.12 2.47c-1.32 0-2.39-1.11-2.41-2.48v-.06c.02-1.38 1.09-2.48 2.41-2.48s2.42 1.12 2.42 2.51c0 1.39-1.09 2.51-2.42 2.51z'/%3E%3C/defs%3E%3Cmask id='clip'%3E%3Crect x='0' y='0' width='100%25' height='100%25' fill='white'/%3E%3Cuse xlink:href='%23logo'/%3E%3Cuse xlink:href='%23text'/%3E%3C/mask%3E%3Cg id='outline' opacity='1' stroke='%23000' stroke-width='3'%3E%3Ccircle mask='url(%23clip)' cx='11.5' cy='11.5' r='9.25'/%3E%3Cuse xlink:href='%23text' mask='url(%23clip)'/%3E%3C/g%3E%3Cg id='fill' opacity='1' fill='%23fff'%3E%3Cuse xlink:href='%23logo'/%3E%3Cuse xlink:href='%23text'/%3E%3C/g%3E%3C/svg%3E\");\n }\n }\n @media (-ms-high-contrast: black-on-white) {\n a.mapboxgl-ctrl-logo {\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' fill-rule='evenodd' viewBox='0 0 88 23'%3E%3Cdefs%3E%3Cpath id='logo' d='M11.5 2.25c5.105 0 9.25 4.145 9.25 9.25s-4.145 9.25-9.25 9.25-9.25-4.145-9.25-9.25 4.145-9.25 9.25-9.25zM6.997 15.983c-.051-.338-.828-5.802 2.233-8.873a4.395 4.395 0 013.13-1.28c1.27 0 2.49.51 3.39 1.42.91.9 1.42 2.12 1.42 3.39 0 1.18-.449 2.301-1.28 3.13C12.72 16.93 7 16 7 16l-.003-.017zM15.3 10.5l-2 .8-.8 2-.8-2-2-.8 2-.8.8-2 .8 2 2 .8z'/%3E%3Cpath id='text' d='M50.63 8c.13 0 .23.1.23.23V9c.7-.76 1.7-1.18 2.73-1.18 2.17 0 3.95 1.85 3.95 4.17s-1.77 4.19-3.94 4.19c-1.04 0-2.03-.43-2.74-1.18v3.77c0 .13-.1.23-.23.23h-1.4c-.13 0-.23-.1-.23-.23V8.23c0-.12.1-.23.23-.23h1.4zm-3.86.01c.01 0 .01 0 .01-.01.13 0 .22.1.22.22v7.55c0 .12-.1.23-.23.23h-1.4c-.13 0-.23-.1-.23-.23V15c-.7.76-1.69 1.19-2.73 1.19-2.17 0-3.94-1.87-3.94-4.19 0-2.32 1.77-4.19 3.94-4.19 1.03 0 2.02.43 2.73 1.18v-.75c0-.12.1-.23.23-.23h1.4zm26.375-.19a4.24 4.24 0 00-4.16 3.29c-.13.59-.13 1.19 0 1.77a4.233 4.233 0 004.17 3.3c2.35 0 4.26-1.87 4.26-4.19 0-2.32-1.9-4.17-4.27-4.17zM60.63 5c.13 0 .23.1.23.23v3.76c.7-.76 1.7-1.18 2.73-1.18 1.88 0 3.45 1.4 3.84 3.28.13.59.13 1.2 0 1.8-.39 1.88-1.96 3.29-3.84 3.29-1.03 0-2.02-.43-2.73-1.18v.77c0 .12-.1.23-.23.23h-1.4c-.13 0-.23-.1-.23-.23V5.23c0-.12.1-.23.23-.23h1.4zm-34 11h-1.4c-.13 0-.23-.11-.23-.23V8.22c.01-.13.1-.22.23-.22h1.4c.13 0 .22.11.23.22v.68c.5-.68 1.3-1.09 2.16-1.1h.03c1.09 0 2.09.6 2.6 1.55.45-.95 1.4-1.55 2.44-1.56 1.62 0 2.93 1.25 2.9 2.78l.03 5.2c0 .13-.1.23-.23.23h-1.41c-.13 0-.23-.11-.23-.23v-4.59c0-.98-.74-1.71-1.62-1.71-.8 0-1.46.7-1.59 1.62l.01 4.68c0 .13-.11.23-.23.23h-1.41c-.13 0-.23-.11-.23-.23v-4.59c0-.98-.74-1.71-1.62-1.71-.85 0-1.54.79-1.6 1.8v4.5c0 .13-.1.23-.23.23zm53.615 0h-1.61c-.04 0-.08-.01-.12-.03-.09-.06-.13-.19-.06-.28l2.43-3.71-2.39-3.65a.213.213 0 01-.03-.12c0-.12.09-.21.21-.21h1.61c.13 0 .24.06.3.17l1.41 2.37 1.4-2.37a.34.34 0 01.3-.17h1.6c.04 0 .08.01.12.03.09.06.13.19.06.28l-2.37 3.65 2.43 3.7c0 .05.01.09.01.13 0 .12-.09.21-.21.21h-1.61c-.13 0-.24-.06-.3-.17l-1.44-2.42-1.44 2.42a.34.34 0 01-.3.17zm-7.12-1.49c-1.33 0-2.42-1.12-2.42-2.51 0-1.39 1.08-2.52 2.42-2.52 1.33 0 2.42 1.12 2.42 2.51 0 1.39-1.08 2.51-2.42 2.52zm-19.865 0c-1.32 0-2.39-1.11-2.42-2.48v-.07c.02-1.38 1.09-2.49 2.4-2.49 1.32 0 2.41 1.12 2.41 2.51 0 1.39-1.07 2.52-2.39 2.53zm-8.11-2.48c-.01 1.37-1.09 2.47-2.41 2.47s-2.42-1.12-2.42-2.51c0-1.39 1.08-2.52 2.4-2.52 1.33 0 2.39 1.11 2.41 2.48l.02.08zm18.12 2.47c-1.32 0-2.39-1.11-2.41-2.48v-.06c.02-1.38 1.09-2.48 2.41-2.48s2.42 1.12 2.42 2.51c0 1.39-1.09 2.51-2.42 2.51z'/%3E%3C/defs%3E%3Cmask id='clip'%3E%3Crect x='0' y='0' width='100%25' height='100%25' fill='white'/%3E%3Cuse xlink:href='%23logo'/%3E%3Cuse xlink:href='%23text'/%3E%3C/mask%3E%3Cg id='outline' opacity='1' stroke='%23fff' stroke-width='3' fill='%23fff'%3E%3Ccircle mask='url(%23clip)' cx='11.5' cy='11.5' r='9.25'/%3E%3Cuse xlink:href='%23text' mask='url(%23clip)'/%3E%3C/g%3E%3Cg id='fill' opacity='1' fill='%23000'%3E%3Cuse xlink:href='%23logo'/%3E%3Cuse xlink:href='%23text'/%3E%3C/g%3E%3C/svg%3E\");\n }\n }\n .mapboxgl-ctrl.mapboxgl-ctrl-attrib {\n background-color: hsla(0, 0%, 100%, 0.5);\n margin: 0;\n padding: 0 5px;\n }\n @media screen {\n .mapboxgl-ctrl-attrib.mapboxgl-compact {\n background-color: #fff;\n border-radius: 12px;\n margin: 10px;\n min-height: 20px;\n padding: 2px 24px 2px 0;\n position: relative;\n }\n .mapboxgl-ctrl-attrib.mapboxgl-compact-show {\n padding: 2px 28px 2px 8px;\n visibility: visible;\n }\n .mapboxgl-ctrl-bottom-left > .mapboxgl-ctrl-attrib.mapboxgl-compact-show,\n .mapboxgl-ctrl-top-left > .mapboxgl-ctrl-attrib.mapboxgl-compact-show {\n border-radius: 12px;\n padding: 2px 8px 2px 28px;\n }\n .mapboxgl-ctrl-attrib.mapboxgl-compact .mapboxgl-ctrl-attrib-inner {\n display: none;\n }\n .mapboxgl-ctrl-attrib-button {\n background-color: hsla(0, 0%, 100%, 0.5);\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill-rule='evenodd'%3E%3Cpath d='M4 10a6 6 0 1 0 12 0 6 6 0 1 0-12 0m5-3a1 1 0 1 0 2 0 1 1 0 1 0-2 0m0 3a1 1 0 1 1 2 0v3a1 1 0 1 1-2 0'/%3E%3C/svg%3E\");\n border: 0;\n border-radius: 12px;\n box-sizing: border-box;\n cursor: pointer;\n display: none;\n height: 24px;\n outline: none;\n position: absolute;\n right: 0;\n top: 0;\n width: 24px;\n }\n .mapboxgl-ctrl-bottom-left .mapboxgl-ctrl-attrib-button,\n .mapboxgl-ctrl-top-left .mapboxgl-ctrl-attrib-button {\n left: 0;\n }\n .mapboxgl-ctrl-attrib.mapboxgl-compact .mapboxgl-ctrl-attrib-button,\n .mapboxgl-ctrl-attrib.mapboxgl-compact-show .mapboxgl-ctrl-attrib-inner {\n display: block;\n }\n .mapboxgl-ctrl-attrib.mapboxgl-compact-show .mapboxgl-ctrl-attrib-button {\n background-color: rgb(0 0 0/5%);\n }\n .mapboxgl-ctrl-bottom-right > .mapboxgl-ctrl-attrib.mapboxgl-compact:after {\n bottom: 0;\n right: 0;\n }\n .mapboxgl-ctrl-top-right > .mapboxgl-ctrl-attrib.mapboxgl-compact:after {\n right: 0;\n top: 0;\n }\n .mapboxgl-ctrl-top-left > .mapboxgl-ctrl-attrib.mapboxgl-compact:after {\n left: 0;\n top: 0;\n }\n .mapboxgl-ctrl-bottom-left > .mapboxgl-ctrl-attrib.mapboxgl-compact:after {\n bottom: 0;\n left: 0;\n }\n }\n @media screen and (-ms-high-contrast: active) {\n .mapboxgl-ctrl-attrib.mapboxgl-compact:after {\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill-rule='evenodd' fill='%23fff'%3E%3Cpath d='M4 10a6 6 0 1 0 12 0 6 6 0 1 0-12 0m5-3a1 1 0 1 0 2 0 1 1 0 1 0-2 0m0 3a1 1 0 1 1 2 0v3a1 1 0 1 1-2 0'/%3E%3C/svg%3E\");\n }\n }\n @media screen and (-ms-high-contrast: black-on-white) {\n .mapboxgl-ctrl-attrib.mapboxgl-compact:after {\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill-rule='evenodd'%3E%3Cpath d='M4 10a6 6 0 1 0 12 0 6 6 0 1 0-12 0m5-3a1 1 0 1 0 2 0 1 1 0 1 0-2 0m0 3a1 1 0 1 1 2 0v3a1 1 0 1 1-2 0'/%3E%3C/svg%3E\");\n }\n }\n .mapboxgl-ctrl-attrib a {\n color: rgba(0, 0, 0, 0.75);\n text-decoration: none;\n }\n .mapboxgl-ctrl-attrib a:hover {\n color: inherit;\n text-decoration: underline;\n }\n .mapboxgl-ctrl-attrib .mapbox-improve-map {\n font-weight: 700;\n margin-left: 2px;\n }\n .mapboxgl-attrib-empty {\n display: none;\n }\n .mapboxgl-ctrl-scale {\n background-color: hsla(0, 0%, 100%, 0.75);\n border: 2px solid #333;\n border-top: #333;\n box-sizing: border-box;\n color: #333;\n font-size: 10px;\n padding: 0 5px;\n white-space: nowrap;\n }\n .mapboxgl-popup {\n display: flex;\n left: 0;\n pointer-events: none;\n position: absolute;\n top: 0;\n will-change: transform;\n }\n .mapboxgl-popup-anchor-top,\n .mapboxgl-popup-anchor-top-left,\n .mapboxgl-popup-anchor-top-right {\n flex-direction: column;\n }\n .mapboxgl-popup-anchor-bottom,\n .mapboxgl-popup-anchor-bottom-left,\n .mapboxgl-popup-anchor-bottom-right {\n flex-direction: column-reverse;\n }\n .mapboxgl-popup-anchor-left {\n flex-direction: row;\n }\n .mapboxgl-popup-anchor-right {\n flex-direction: row-reverse;\n }\n .mapboxgl-popup-tip {\n border: 10px solid transparent;\n height: 0;\n width: 0;\n z-index: 1;\n }\n .mapboxgl-popup-anchor-top .mapboxgl-popup-tip {\n align-self: center;\n border-bottom-color: #fff;\n border-top: none;\n }\n .mapboxgl-popup-anchor-top-left .mapboxgl-popup-tip {\n align-self: flex-start;\n border-bottom-color: #fff;\n border-left: none;\n border-top: none;\n }\n .mapboxgl-popup-anchor-top-right .mapboxgl-popup-tip {\n align-self: flex-end;\n border-bottom-color: #fff;\n border-right: none;\n border-top: none;\n }\n .mapboxgl-popup-anchor-bottom .mapboxgl-popup-tip {\n align-self: center;\n border-bottom: none;\n border-top-color: #fff;\n }\n .mapboxgl-popup-anchor-bottom-left .mapboxgl-popup-tip {\n align-self: flex-start;\n border-bottom: none;\n border-left: none;\n border-top-color: #fff;\n }\n .mapboxgl-popup-anchor-bottom-right .mapboxgl-popup-tip {\n align-self: flex-end;\n border-bottom: none;\n border-right: none;\n border-top-color: #fff;\n }\n .mapboxgl-popup-anchor-left .mapboxgl-popup-tip {\n align-self: center;\n border-left: none;\n border-right-color: #fff;\n }\n .mapboxgl-popup-anchor-right .mapboxgl-popup-tip {\n align-self: center;\n border-left-color: #fff;\n border-right: none;\n }\n .mapboxgl-popup-close-button {\n background-color: transparent;\n border: 0;\n border-radius: 0 3px 0 0;\n cursor: pointer;\n position: absolute;\n right: 0;\n top: 0;\n }\n .mapboxgl-popup-close-button:hover {\n background-color: rgb(0 0 0/5%);\n }\n .mapboxgl-popup-content {\n background: #fff;\n border-radius: 3px;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1);\n padding: 10px 10px 15px;\n pointer-events: auto;\n position: relative;\n }\n .mapboxgl-popup-anchor-top-left .mapboxgl-popup-content {\n border-top-left-radius: 0;\n }\n .mapboxgl-popup-anchor-top-right .mapboxgl-popup-content {\n border-top-right-radius: 0;\n }\n .mapboxgl-popup-anchor-bottom-left .mapboxgl-popup-content {\n border-bottom-left-radius: 0;\n }\n .mapboxgl-popup-anchor-bottom-right .mapboxgl-popup-content {\n border-bottom-right-radius: 0;\n }\n .mapboxgl-popup-track-pointer {\n display: none;\n }\n .mapboxgl-popup-track-pointer * {\n pointer-events: none;\n user-select: none;\n }\n .mapboxgl-map:hover .mapboxgl-popup-track-pointer {\n display: flex;\n }\n .mapboxgl-map:active .mapboxgl-popup-track-pointer {\n display: none;\n }\n .mapboxgl-marker {\n left: 0;\n opacity: 1;\n position: absolute;\n top: 0;\n transition: opacity 0.2s;\n will-change: transform;\n }\n .mapboxgl-user-location-dot,\n .mapboxgl-user-location-dot:before {\n background-color: #1da1f2;\n border-radius: 50%;\n height: 15px;\n width: 15px;\n }\n .mapboxgl-user-location-dot:before {\n animation: mapboxgl-user-location-dot-pulse 2s infinite;\n content: '';\n position: absolute;\n }\n .mapboxgl-user-location-dot:after {\n border: 2px solid #fff;\n border-radius: 50%;\n box-shadow: 0 0 3px rgba(0, 0, 0, 0.35);\n box-sizing: border-box;\n content: '';\n height: 19px;\n left: -2px;\n position: absolute;\n top: -2px;\n width: 19px;\n }\n .mapboxgl-user-location-show-heading .mapboxgl-user-location-heading {\n height: 0;\n width: 0;\n }\n .mapboxgl-user-location-show-heading .mapboxgl-user-location-heading:after,\n .mapboxgl-user-location-show-heading .mapboxgl-user-location-heading:before {\n border-bottom: 7.5px solid #4aa1eb;\n content: '';\n position: absolute;\n }\n .mapboxgl-user-location-show-heading .mapboxgl-user-location-heading:before {\n border-left: 7.5px solid transparent;\n transform: translateY(-28px) skewY(-20deg);\n }\n .mapboxgl-user-location-show-heading .mapboxgl-user-location-heading:after {\n border-right: 7.5px solid transparent;\n transform: translate(7.5px, -28px) skewY(20deg);\n }\n @keyframes mapboxgl-user-location-dot-pulse {\n 0% {\n opacity: 1;\n transform: scale(1);\n }\n 70% {\n opacity: 0;\n transform: scale(3);\n }\n to {\n opacity: 0;\n transform: scale(1);\n }\n }\n .mapboxgl-user-location-dot-stale {\n background-color: #aaa;\n }\n .mapboxgl-user-location-dot-stale:after {\n display: none;\n }\n .mapboxgl-user-location-accuracy-circle {\n background-color: #1da1f233;\n border-radius: 100%;\n height: 1px;\n width: 1px;\n }\n .mapboxgl-crosshair,\n .mapboxgl-crosshair .mapboxgl-interactive,\n .mapboxgl-crosshair .mapboxgl-interactive:active {\n cursor: crosshair;\n }\n .mapboxgl-boxzoom {\n background: #fff;\n border: 2px dotted #202020;\n height: 0;\n left: 0;\n opacity: 0.5;\n position: absolute;\n top: 0;\n width: 0;\n }\n @media print {\n .mapbox-improve-map {\n display: none;\n }\n }\n .mapboxgl-scroll-zoom-blocker,\n .mapboxgl-touch-pan-blocker {\n align-items: center;\n background: rgba(0, 0, 0, 0.7);\n color: #fff;\n display: flex;\n font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Helvetica, Arial,\n sans-serif;\n height: 100%;\n justify-content: center;\n left: 0;\n opacity: 0;\n pointer-events: none;\n position: absolute;\n text-align: center;\n top: 0;\n transition: opacity 0.75s ease-in-out;\n transition-delay: 1s;\n width: 100%;\n }\n .mapboxgl-scroll-zoom-blocker-show,\n .mapboxgl-touch-pan-blocker-show {\n opacity: 1;\n transition: opacity 0.1s ease-in-out;\n }\n .mapboxgl-canvas-container.mapboxgl-touch-pan-blocker-override.mapboxgl-scrollable-page,\n .mapboxgl-canvas-container.mapboxgl-touch-pan-blocker-override.mapboxgl-scrollable-page\n .mapboxgl-canvas {\n touch-action: pan-x pan-y;\n }\n"])));
3755
-
3756
- var _templateObject$3;
3755
+ var projectPinImage = 'https://cdn.jsdelivr.net/npm/@phosphor-icons/core@2.0.2/assets/fill/map-pin-fill.svg';
3757
3756
  mapboxgl__default.default.accessToken = MAPBOX_TOKEN;
3757
+ var FALLBACK_BBOX = '-1.9950830850086163,44.4464186384987,21.995083085002875,54.12644342419196';
3758
3758
  var ProjectsMap = function ProjectsMap(_ref) {
3759
- var slice = _ref.slice,
3760
- projects = _ref.projects;
3759
+ var slice = _ref.slice;
3761
3760
  var _useContext = React.useContext(IntlContext),
3762
- locale = _useContext.locale;
3763
- var filteredProjects = projects.filter(function (project) {
3764
- return project.geom;
3765
- });
3766
- var center = slice.defaultCenterCoordinates ? [slice.defaultCenterCoordinates.longitude, slice.defaultCenterCoordinates.latitude] : undefined;
3767
- var bounds = center ? undefined : mergeBoundingBoxes(filteredProjects.map(function (p) {
3768
- return [].concat(p.geom.coordinates.map(function (c) {
3769
- return c - 0.2;
3770
- }), p.geom.coordinates.map(function (c) {
3771
- return c + 0.2;
3772
- }));
3773
- }));
3761
+ locale = _useContext.locale,
3762
+ formatMessage = _useContext.formatMessage;
3774
3763
  var mapContainer = React.useRef(null);
3775
- React.useEffect(function () {
3776
- var map = new mapboxgl.Map({
3777
- container: mapContainer.current || '',
3778
- style: MapBoxStyle.CaliTerrain,
3779
- center: center,
3780
- zoom: slice.defaultZoomLevel || MAPBOX_INITIAL_ZOOM,
3781
- maxZoom: MAPBOX_MAX_ZOOM,
3782
- bounds: bounds
3764
+ var map = React.useRef(null);
3765
+ var animationIntervalRef = React.useRef(null);
3766
+ var _useState = React.useState(null),
3767
+ featureCollection = _useState[0],
3768
+ setFeatureCollection = _useState[1];
3769
+ var _useState2 = React.useState(false),
3770
+ isLoading = _useState2[0],
3771
+ setIsLoading = _useState2[1];
3772
+ var initialBboxRef = React.useRef(null);
3773
+ var _useState3 = React.useState(false),
3774
+ isMapReady = _useState3[0],
3775
+ setIsMapReady = _useState3[1];
3776
+ var _useState4 = React.useState(null),
3777
+ strapiProjects = _useState4[0],
3778
+ setStrapiProjects = _useState4[1];
3779
+ var isBboxContained = React.useCallback(function (innerBbox, outerBbox) {
3780
+ var _innerBbox$split$map = innerBbox.split(',').map(Number),
3781
+ innerWest = _innerBbox$split$map[0],
3782
+ innerSouth = _innerBbox$split$map[1],
3783
+ innerEast = _innerBbox$split$map[2],
3784
+ innerNorth = _innerBbox$split$map[3];
3785
+ var _outerBbox$split$map = outerBbox.split(',').map(Number),
3786
+ outerWest = _outerBbox$split$map[0],
3787
+ outerSouth = _outerBbox$split$map[1],
3788
+ outerEast = _outerBbox$split$map[2],
3789
+ outerNorth = _outerBbox$split$map[3];
3790
+ return innerWest >= outerWest && innerEast <= outerEast && innerSouth >= outerSouth && innerNorth <= outerNorth;
3791
+ }, []);
3792
+ var fetchStrapiData = React.useCallback(/*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee() {
3793
+ var data;
3794
+ return _regeneratorRuntime().wrap(function _callee$(_context) {
3795
+ while (1) switch (_context.prev = _context.next) {
3796
+ case 0:
3797
+ if (!strapiProjects) {
3798
+ _context.next = 2;
3799
+ break;
3800
+ }
3801
+ return _context.abrupt("return");
3802
+ case 2:
3803
+ _context.prev = 2;
3804
+ _context.next = 5;
3805
+ return getStrapiProjects(locale, '2');
3806
+ case 5:
3807
+ data = _context.sent;
3808
+ // pLevel = Population depth which is a param in the API request. 2 is enough to get the slug and the portfolioHost
3809
+ setStrapiProjects(data);
3810
+ _context.next = 12;
3811
+ break;
3812
+ case 9:
3813
+ _context.prev = 9;
3814
+ _context.t0 = _context["catch"](2);
3815
+ console.error('❌ Error fetching Strapi projects:', _context.t0);
3816
+ case 12:
3817
+ case "end":
3818
+ return _context.stop();
3819
+ }
3820
+ }, _callee, null, [[2, 9]]);
3821
+ })), [locale, strapiProjects]);
3822
+ var fetchProjectsData = React.useCallback(/*#__PURE__*/function () {
3823
+ var _ref3 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee2(bbox) {
3824
+ var fpmData, mergedData;
3825
+ return _regeneratorRuntime().wrap(function _callee2$(_context2) {
3826
+ while (1) switch (_context2.prev = _context2.next) {
3827
+ case 0:
3828
+ setIsLoading(true);
3829
+ _context2.prev = 1;
3830
+ _context2.next = 4;
3831
+ return getFpmProjectsByBbox(bbox);
3832
+ case 4:
3833
+ fpmData = _context2.sent;
3834
+ // If we have Strapi data, merge it, otherwise show FPM data immediately
3835
+ mergedData = strapiProjects ? mergeProjectData(fpmData, strapiProjects) : fpmData;
3836
+ setFeatureCollection(mergedData);
3837
+ _context2.next = 12;
3838
+ break;
3839
+ case 9:
3840
+ _context2.prev = 9;
3841
+ _context2.t0 = _context2["catch"](1);
3842
+ console.error('Error fetching projects:', _context2.t0);
3843
+ case 12:
3844
+ _context2.prev = 12;
3845
+ setIsLoading(false);
3846
+ return _context2.finish(12);
3847
+ case 15:
3848
+ case "end":
3849
+ return _context2.stop();
3850
+ }
3851
+ }, _callee2, null, [[1, 9, 12, 15]]);
3852
+ }));
3853
+ return function (_x) {
3854
+ return _ref3.apply(this, arguments);
3855
+ };
3856
+ }(), [strapiProjects]);
3857
+ var debouncedUpdateBbox = React.useCallback(debounce__default.default(function () {
3858
+ if (!map.current || !initialBboxRef.current) return;
3859
+ var bounds = map.current.getBounds();
3860
+ var newBbox = bounds.getWest() + "," + bounds.getSouth() + "," + bounds.getEast() + "," + bounds.getNorth();
3861
+ if (!isBboxContained(newBbox, initialBboxRef.current)) {
3862
+ fetchProjectsData(newBbox);
3863
+ initialBboxRef.current = newBbox;
3864
+ }
3865
+ }, 500), [fetchProjectsData, isBboxContained]);
3866
+ var addProjectsLayer = React.useCallback(function () {
3867
+ if (!map.current || !featureCollection || !map.current.isStyleLoaded()) {
3868
+ return;
3869
+ }
3870
+ var filteredFeatureCollection = _extends({}, featureCollection, {
3871
+ features: featureCollection.features.filter(function (feature) {
3872
+ var _feature$properties;
3873
+ return ((_feature$properties = feature.properties) == null ? void 0 : _feature$properties.isPublic) !== false;
3874
+ })
3783
3875
  });
3784
- filteredProjects
3785
- // Sort by longitude, so that the markers are rendeed form right to left
3786
- .sort(function (a, b) {
3787
- return b.geom.coordinates[0] - a.geom.coordinates[0];
3788
- }).forEach(function (project) {
3789
- var _project$projectDevel;
3790
- var ref = React.createRef();
3791
- ref.current = document.createElement('div');
3792
- client.createRoot(ref.current).render(React__default.default.createElement(MinimalProviders, {
3793
- locale: locale
3794
- }, React__default.default.createElement(MapMarker, {
3795
- title: project.friendlyName || project.title,
3796
- isPublic: project.isPublic,
3797
- portfolioHost: project.portfolioHost,
3798
- slug: project.slug,
3799
- creditAvailability: project.creditAvailability,
3800
- projectDeveloper: (_project$projectDevel = project.projectDeveloper) == null ? void 0 : _project$projectDevel.name
3801
- })));
3802
- // Offset is needed to center the marker on the coordinates
3803
- var marker = new mapboxgl.Marker(ref.current, {
3804
- offset: [-20, -40]
3876
+ var source = map.current.getSource('projects');
3877
+ if (!source) {
3878
+ map.current.addSource('projects', {
3879
+ type: 'geojson',
3880
+ data: filteredFeatureCollection,
3881
+ cluster: true,
3882
+ clusterMaxZoom: 14,
3883
+ clusterRadius: 50
3884
+ });
3885
+ map.current.addLayer({
3886
+ id: 'clusters',
3887
+ type: 'circle',
3888
+ source: 'projects',
3889
+ filter: ['has', 'point_count'],
3890
+ paint: {
3891
+ 'circle-color': ['step', ['get', 'point_count'], '#51bbd6', 2, '#2A3FBA'],
3892
+ 'circle-radius': ['step', ['get', 'point_count'], 20, 10, 30, 30, 40],
3893
+ 'circle-radius-transition': {
3894
+ duration: 300
3895
+ },
3896
+ 'circle-stroke-width': 5,
3897
+ 'circle-stroke-color': '#2A3FBA',
3898
+ 'circle-stroke-opacity': 0.4
3899
+ }
3900
+ });
3901
+ if (animationIntervalRef.current) {
3902
+ clearInterval(animationIntervalRef.current);
3903
+ }
3904
+ animationIntervalRef.current = setInterval(function () {
3905
+ if (!map.current) return;
3906
+ var now = Date.now() / 1000;
3907
+ var pulseFactor = 1 + 0.05 * Math.sin(now * 2 * Math.PI / 2.8);
3908
+ var expression = ['step', ['get', 'point_count'], 20 * pulseFactor, 10, 30 * pulseFactor, 30, 40 * pulseFactor];
3909
+ map.current.setPaintProperty('clusters', 'circle-radius', expression);
3910
+ }, 50);
3911
+ map.current.addLayer({
3912
+ id: 'cluster-count',
3913
+ type: 'symbol',
3914
+ source: 'projects',
3915
+ filter: ['has', 'point_count'],
3916
+ layout: {
3917
+ 'text-field': '{point_count_abbreviated}',
3918
+ 'text-font': ['DIN Offc Pro Medium', 'Arial Unicode MS Bold'],
3919
+ 'text-size': 12
3920
+ },
3921
+ paint: {
3922
+ 'text-color': '#fff'
3923
+ }
3924
+ });
3925
+ // Load SVG as PNG
3926
+ fetch(projectPinImage).then(function (response) {
3927
+ return response.text();
3928
+ }).then(function (svgText) {
3929
+ // Modify SVG color
3930
+ var modifiedSvg = svgText.replace(/fill="[^"]*"/, "fill=\"#2A3FBA\"");
3931
+ var img = new Image();
3932
+ img.src = "data:image/svg+xml;base64," + btoa(modifiedSvg);
3933
+ return new Promise(function (resolve, reject) {
3934
+ img.onload = function () {
3935
+ return resolve(img);
3936
+ };
3937
+ img.onerror = reject;
3938
+ });
3939
+ }).then(function (img) {
3940
+ if (!map.current) return;
3941
+ var canvas = document.createElement('canvas');
3942
+ canvas.width = 80;
3943
+ canvas.height = 80;
3944
+ var ctx = canvas.getContext('2d');
3945
+ if (!ctx) return;
3946
+ ctx.drawImage(img, 10, 10, 60, 60);
3947
+ var pngImg = new Image();
3948
+ pngImg.src = canvas.toDataURL('image/png');
3949
+ pngImg.onload = function () {
3950
+ var _map$current, _map$current2;
3951
+ (_map$current = map.current) == null || _map$current.addImage('project-pin', pngImg, {
3952
+ pixelRatio: 2
3953
+ });
3954
+ (_map$current2 = map.current) == null || _map$current2.addLayer({
3955
+ id: 'unclustered-point',
3956
+ type: 'symbol',
3957
+ source: 'projects',
3958
+ filter: ['!', ['has', 'point_count']],
3959
+ layout: {
3960
+ 'icon-image': 'project-pin'
3961
+ }
3962
+ });
3963
+ };
3964
+ })["catch"](function (error) {
3965
+ console.error('Error loading project pin image:', error);
3966
+ });
3967
+ var popup = new mapboxgl__default.default.Popup({
3968
+ closeButton: true,
3969
+ closeOnClick: false,
3970
+ className: 'custom-popup',
3971
+ offset: [0, -20]
3805
3972
  });
3806
- // No chaining here, because the mocks don't support it
3807
- marker.setLngLat(project.geom.coordinates);
3808
- marker.addTo(map);
3973
+ var style = document.createElement('style');
3974
+ style.textContent = "\n .custom-popup .mapboxgl-popup-content {\n border-radius: 8px;\n padding: 12px;\n box-shadow: 0 2px 4px rgba(0,0,0,0.2);\n background: white;\n color: #333;\n }\n .mapboxgl-popup {\n max-width: 300px !important;\n }\n .mapboxgl-popup-close-button {\n padding: 4px 8px;\n font-size: 16px;\n color: #666;\n }\n .mapboxgl-popup-close-button:hover {\n background: #f0f0f0;\n color: #333;\n }\n ";
3975
+ document.head.appendChild(style);
3976
+ map.current.on('click', 'unclustered-point', function (e) {
3977
+ if (!e.features || !e.features[0].properties) return;
3978
+ map.current.getCanvas().style.cursor = 'pointer';
3979
+ var coordinates = e.features[0].geometry.coordinates.slice();
3980
+ var _e$features$0$propert = e.features[0].properties,
3981
+ title = _e$features$0$propert.title,
3982
+ projectDeveloper = _e$features$0$propert.projectDeveloper,
3983
+ slug = _e$features$0$propert.slug,
3984
+ portfolioHost = _e$features$0$propert.portfolioHost,
3985
+ creditAvailability = _e$features$0$propert.creditAvailability;
3986
+ // Calculate if popup would go off screen at the top
3987
+ var point = map.current.project(coordinates);
3988
+ var popupHeight = 150; // Approximate height of popup
3989
+ var offset = point.y - popupHeight - 20 < 0 ? [0, 20] : [0, -20];
3990
+ var developer = 'Unknown';
3991
+ try {
3992
+ var projectDeveloperRaw = projectDeveloper;
3993
+ if (projectDeveloperRaw) {
3994
+ var _JSON$parse$name, _JSON$parse;
3995
+ developer = (_JSON$parse$name = (_JSON$parse = JSON.parse(projectDeveloperRaw)) == null ? void 0 : _JSON$parse.name) != null ? _JSON$parse$name : 'Unknown';
3996
+ }
3997
+ } catch (_unused) {
3998
+ developer = 'Unknown';
3999
+ }
4000
+ var projectUrl = slug && portfolioHost ? portfolioHost + "/portfolio/" + slug : null;
4001
+ var getBadgeMessage = function getBadgeMessage(status) {
4002
+ switch (status) {
4003
+ case CreditAvailability.CREDITS_AVAILABLE:
4004
+ return formatMessage({
4005
+ id: 'components.creditsAvailableBadge.text.yes'
4006
+ });
4007
+ case CreditAvailability.NO_CREDITS_AVAILABLE:
4008
+ return formatMessage({
4009
+ id: 'components.creditsAvailableBadge.text.no'
4010
+ });
4011
+ case CreditAvailability.SOME_CREDITS_AVAILABLE:
4012
+ return formatMessage({
4013
+ id: 'components.creditsAvailableBadge.text.some'
4014
+ });
4015
+ case CreditAvailability.SOON_CREDITS_AVAILABLE:
4016
+ return formatMessage({
4017
+ id: 'components.creditsAvailableBadge.text.notYet'
4018
+ });
4019
+ default:
4020
+ return '';
4021
+ }
4022
+ };
4023
+ var getBadgeColor = function getBadgeColor(status) {
4024
+ switch (status) {
4025
+ case CreditAvailability.CREDITS_AVAILABLE:
4026
+ return '#15803d';
4027
+ case CreditAvailability.NO_CREDITS_AVAILABLE:
4028
+ return '#b91c1c';
4029
+ case CreditAvailability.SOME_CREDITS_AVAILABLE:
4030
+ return '#ea580c';
4031
+ case CreditAvailability.SOON_CREDITS_AVAILABLE:
4032
+ return '#2563eb';
4033
+ default:
4034
+ return '#e0e7ff';
4035
+ }
4036
+ };
4037
+ var badgeColor = getBadgeColor(creditAvailability);
4038
+ var badgeMessage = getBadgeMessage(creditAvailability);
4039
+ var badge = projectUrl ? "<a href=\"" + projectUrl + "\" target=\"_blank\" rel=\"noopener\" style=\"text-decoration: none;\"><span style=\"display: inline-block; background: " + badgeColor + "; color: white; font-weight: 600; border-radius: 4px; padding: 2px 8px; font-size: 12px; margin-bottom: 6px; cursor: pointer;\">" + badgeMessage + "</span></a>" : "<span style=\"display: inline-block; background: " + badgeColor + "; color: white; font-weight: 600; border-radius: 4px; padding: 2px 8px; font-size: 12px; margin-bottom: 6px;\">" + badgeMessage + "</span>";
4040
+ var button = projectUrl ? "<a href=\"" + projectUrl + "\" target=\"_blank\" rel=\"noopener\" style=\"display: inline-block; margin-top: 12px; padding: 4px 8px; border: 1px solid #e2e8f0; border-radius: 4px; background: #fff; font-size: 14px; font-weight: 700; text-decoration: none;\">Show more info</a>" : '';
4041
+ var description = "\n <div style=\"padding: 2px; padding-right: 16px; min-width: 180px; max-width: 260px;\">\n " + badge + "\n <h3 style=\"font-size: 15px; font-weight: bold;\">" + title + "</h3>\n <p style=\"font-size: 15px; color: #64748b;\">" + developer + "</p>\n " + button + "\n </div>\n ";
4042
+ while (Math.abs(e.lngLat.lng - coordinates[0]) > 180) {
4043
+ coordinates[0] += e.lngLat.lng > coordinates[0] ? 360 : -360;
4044
+ }
4045
+ popup.setOffset(offset).setLngLat(coordinates).setHTML(description).addTo(map.current);
4046
+ });
4047
+ map.current.on('click', 'clusters', function (e) {
4048
+ var _map$current3, _map$current4;
4049
+ var features = (_map$current3 = map.current) == null ? void 0 : _map$current3.queryRenderedFeatures(e.point, {
4050
+ layers: ['clusters']
4051
+ });
4052
+ if (!features || !features[0].properties) return;
4053
+ var clusterId = features[0].properties.cluster_id;
4054
+ var projectSource = (_map$current4 = map.current) == null ? void 0 : _map$current4.getSource('projects');
4055
+ projectSource.getClusterExpansionZoom(clusterId, function (err, zoom) {
4056
+ if (err || !map.current) return;
4057
+ var coordinates = features[0].geometry.coordinates;
4058
+ map.current.easeTo({
4059
+ center: coordinates,
4060
+ zoom: zoom
4061
+ });
4062
+ });
4063
+ });
4064
+ map.current.on('mouseenter', 'clusters', function () {
4065
+ if (map.current) map.current.getCanvas().style.cursor = 'pointer';
4066
+ });
4067
+ map.current.on('mouseleave', 'clusters', function () {
4068
+ if (map.current) map.current.getCanvas().style.cursor = '';
4069
+ });
4070
+ map.current.on('mouseenter', 'unclustered-point', function () {
4071
+ if (map.current) map.current.getCanvas().style.cursor = 'pointer';
4072
+ });
4073
+ map.current.on('mouseleave', 'unclustered-point', function () {
4074
+ if (map.current) map.current.getCanvas().style.cursor = '';
4075
+ });
4076
+ } else {
4077
+ source.setData(filteredFeatureCollection);
4078
+ }
4079
+ }, [featureCollection, locale, formatMessage]);
4080
+ React.useEffect(function () {
4081
+ if (map.current || !mapContainer.current) return;
4082
+ var initialCenter;
4083
+ var initialZoom;
4084
+ if (slice.defaultCenterCoordinates && slice.defaultZoomLevel) {
4085
+ initialCenter = [slice.defaultCenterCoordinates.longitude, slice.defaultCenterCoordinates.latitude];
4086
+ initialZoom = slice.defaultZoomLevel;
4087
+ } else {
4088
+ // Always start with fallback view - don't wait for user location
4089
+ var bbox = initialBboxRef.current || FALLBACK_BBOX;
4090
+ var _bbox$split$map = bbox.split(',').map(Number),
4091
+ west = _bbox$split$map[0],
4092
+ south = _bbox$split$map[1],
4093
+ east = _bbox$split$map[2],
4094
+ north = _bbox$split$map[3];
4095
+ var bounds = new mapboxgl__default.default.LngLatBounds([west, south], [east, north]);
4096
+ var center = bounds.getCenter();
4097
+ initialCenter = [center.lng, center.lat];
4098
+ initialZoom = 6;
4099
+ }
4100
+ map.current = new mapboxgl__default.default.Map({
4101
+ container: mapContainer.current,
4102
+ style: 'mapbox://styles/mapbox/streets-v12',
4103
+ center: initialCenter,
4104
+ zoom: initialZoom,
4105
+ maxZoom: MAPBOX_MAX_ZOOM
4106
+ });
4107
+ map.current.addControl(new mapboxgl__default.default.NavigationControl(), 'top-right');
4108
+ map.current.on('load', function () {
4109
+ setIsMapReady(true);
4110
+ if (!(slice.defaultCenterCoordinates && slice.defaultZoomLevel)) {
4111
+ var _map$current5;
4112
+ var _bbox = initialBboxRef.current || FALLBACK_BBOX;
4113
+ var _bbox$split$map2 = _bbox.split(',').map(Number),
4114
+ _west = _bbox$split$map2[0],
4115
+ _south = _bbox$split$map2[1],
4116
+ _east = _bbox$split$map2[2],
4117
+ _north = _bbox$split$map2[3];
4118
+ var _bounds = new mapboxgl__default.default.LngLatBounds([_west, _south], [_east, _north]);
4119
+ (_map$current5 = map.current) == null || _map$current5.fitBounds(_bounds, {
4120
+ padding: 20
4121
+ });
4122
+ }
4123
+ });
4124
+ map.current.on('moveend', function () {
4125
+ if (initialBboxRef.current) {
4126
+ debouncedUpdateBbox();
4127
+ }
3809
4128
  });
3810
- // Clean up on unmount
3811
4129
  return function () {
3812
- return map.remove();
4130
+ var _map$current6;
4131
+ debouncedUpdateBbox.cancel();
4132
+ if (animationIntervalRef.current) {
4133
+ clearInterval(animationIntervalRef.current);
4134
+ }
4135
+ (_map$current6 = map.current) == null || _map$current6.remove();
4136
+ map.current = null;
3813
4137
  };
3814
- }, [locale]);
4138
+ }, [slice.defaultCenterCoordinates, slice.defaultZoomLevel, debouncedUpdateBbox]);
4139
+ // Fetch Strapi data once on component mount
4140
+ React.useEffect(function () {
4141
+ fetchStrapiData();
4142
+ }, [fetchStrapiData]);
4143
+ // Handle re-merging data when Strapi data becomes available
4144
+ React.useEffect(function () {
4145
+ if (strapiProjects && featureCollection) {
4146
+ var mergedData = mergeProjectData(featureCollection, strapiProjects);
4147
+ setFeatureCollection(mergedData);
4148
+ }
4149
+ }, [strapiProjects]);
4150
+ // Request user location (non-blocking)
4151
+ React.useEffect(function () {
4152
+ if (slice.defaultCenterCoordinates && slice.defaultZoomLevel) {
4153
+ // Use provided default coordinates
4154
+ var _slice$defaultCenterC = slice.defaultCenterCoordinates,
4155
+ latitude = _slice$defaultCenterC.latitude,
4156
+ longitude = _slice$defaultCenterC.longitude;
4157
+ var buffer = 10;
4158
+ var bbox = longitude - buffer + "," + (latitude - buffer) + "," + (longitude + buffer) + "," + (latitude + buffer);
4159
+ initialBboxRef.current = bbox;
4160
+ fetchProjectsData(bbox);
4161
+ } else if (navigator.geolocation) {
4162
+ // Set fallback immediately (non-blocking)
4163
+ initialBboxRef.current = FALLBACK_BBOX;
4164
+ fetchProjectsData(FALLBACK_BBOX);
4165
+ // Request user location asynchronously
4166
+ navigator.geolocation.getCurrentPosition(function (position) {
4167
+ var userLoc = {
4168
+ lat: position.coords.latitude,
4169
+ lon: position.coords.longitude
4170
+ };
4171
+ if (map.current) {
4172
+ map.current.easeTo({
4173
+ center: [userLoc.lon, userLoc.lat],
4174
+ zoom: 10,
4175
+ duration: 1500
4176
+ });
4177
+ // Update bbox for this location
4178
+ var _buffer = 1;
4179
+ var _bbox2 = userLoc.lon - _buffer + "," + (userLoc.lat - _buffer) + "," + (userLoc.lon + _buffer) + "," + (userLoc.lat + _buffer);
4180
+ initialBboxRef.current = _bbox2;
4181
+ fetchProjectsData(_bbox2);
4182
+ }
4183
+ }, function () {
4184
+ // Permission denied or error - already have fallback data loaded
4185
+ // No need to re-fetch since we already loaded FALLBACK_BBOX data
4186
+ });
4187
+ } else {
4188
+ // Geolocation not supported - use fallback
4189
+ initialBboxRef.current = FALLBACK_BBOX;
4190
+ fetchProjectsData(FALLBACK_BBOX);
4191
+ }
4192
+ }, [slice.defaultCenterCoordinates, slice.defaultZoomLevel, fetchProjectsData]);
4193
+ React.useEffect(function () {
4194
+ var _map$current7;
4195
+ if (isMapReady && featureCollection && (_map$current7 = map.current) != null && _map$current7.isStyleLoaded()) {
4196
+ addProjectsLayer();
4197
+ }
4198
+ }, [isMapReady, featureCollection, addProjectsLayer]);
3815
4199
  return React__default.default.createElement(boemly.DefaultSectionContainer, null, React__default.default.createElement(boemly.Box, {
3816
4200
  css: mapboxStyle
3817
4201
  }, React__default.default.createElement(boemly.Wrapper, null, slice.title ? React__default.default.createElement(React__default.default.Fragment, null, React__default.default.createElement(boemly.DefaultSectionHeader, {
@@ -3838,9 +4222,8 @@ var ProjectsMap = function ProjectsMap(_ref) {
3838
4222
  ref: mapContainer,
3839
4223
  borderRadius: "xl",
3840
4224
  overflow: "hidden",
3841
- boxShadow: ['md', null, null, 'none'],
3842
- css: react$1.css(_templateObject$3 || (_templateObject$3 = _taggedTemplateLiteralLoose(["\n mask-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAIAAACQd1PeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAA5JREFUeNpiYGBgAAgwAAAEAAGbA+oJAAAAAElFTkSuQmCC);\n "])))
3843
- }))));
4225
+ boxShadow: ['md', null, null, 'none']
4226
+ }), React__default.default.createElement(React__default.default.Fragment, null, isLoading && React__default.default.createElement(boemly.Box, null, "Loading projects...")))));
3844
4227
  };
3845
4228
 
3846
4229
  var Video = function Video(_ref) {
@@ -6912,8 +7295,7 @@ var SliceRenderer = function SliceRenderer(_ref) {
6912
7295
  case 'sections.projects-map':
6913
7296
  return React__default.default.createElement(ProjectsMap, {
6914
7297
  key: slice.__component + "-" + slice.id,
6915
- slice: slice,
6916
- projects: projects
7298
+ slice: slice
6917
7299
  });
6918
7300
  case 'sections.video':
6919
7301
  return React__default.default.createElement(Video, {