@treely/strapi-slices 7.13.0 → 7.14.0
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.
- package/dist/components/SEOTags/SEOTags.d.ts +2 -3
- package/dist/integrations/strapi/getFpmProjectsByBbox.d.ts +3 -0
- package/dist/integrations/strapi/getStrapiProjects.d.ts +3 -0
- package/dist/strapi-slices.cjs.development.js +194 -143
- package/dist/strapi-slices.cjs.development.js.map +1 -1
- package/dist/strapi-slices.cjs.production.min.js +1 -1
- package/dist/strapi-slices.cjs.production.min.js.map +1 -1
- package/dist/strapi-slices.esm.js +194 -143
- package/dist/strapi-slices.esm.js.map +1 -1
- package/dist/utils/mergeProjectData.d.ts +4 -0
- package/package.json +1 -1
- package/src/components/SEOTags/SEOTags.tsx +19 -36
- package/src/integrations/strapi/getFpmProjectsByBbox.test.ts +115 -0
- package/src/integrations/strapi/getFpmProjectsByBbox.ts +24 -0
- package/src/integrations/strapi/getPortfolioProjects.ts +5 -46
- package/src/integrations/strapi/getStrapiProjects.test.ts +167 -0
- package/src/integrations/strapi/getStrapiProjects.ts +57 -0
- package/src/slices/ProjectsMap/ProjectsMap.test.tsx +5 -5
- package/src/slices/ProjectsMap/ProjectsMap.tsx +76 -36
- package/src/utils/mergeProjectData.ts +34 -0
- package/dist/integrations/strapi/getPortfolioProjectsByBbox.d.ts +0 -3
- package/src/integrations/strapi/getPortfolioProjectsByBbox.test.ts +0 -82
- package/src/integrations/strapi/getPortfolioProjectsByBbox.ts +0 -86
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
-
import { Article, BlogPosting, Brand, BreadcrumbList, Event, FAQPage, HowTo, LocalBusiness, Offer, Organization, Person, Product, Service, WebPage, WithContext } from 'schema-dts';
|
|
3
|
-
type SupportedSchemaType = Article | BlogPosting | Brand | BreadcrumbList | Event | FAQPage | HowTo | LocalBusiness | Offer | Organization | Person | Product | Service | WebPage;
|
|
2
|
+
import { Article, BlogPosting, Brand, BreadcrumbList, Event, FAQPage, HowTo, LocalBusiness, Offer, Organization, Person, Product, QAPage, Service, SoftwareApplication, WebPage, WithContext } from 'schema-dts';
|
|
3
|
+
type SupportedSchemaType = Article | BlogPosting | Brand | BreadcrumbList | Event | FAQPage | HowTo | LocalBusiness | Offer | Organization | Person | Product | QAPage | Product | Service | SoftwareApplication | WebPage;
|
|
4
4
|
interface SEOTagsProps {
|
|
5
5
|
title: string;
|
|
6
6
|
description: string;
|
|
@@ -16,7 +16,6 @@ interface SEOTagsProps {
|
|
|
16
16
|
* This can be a single schema object or an array of schema objects.
|
|
17
17
|
* Each object must include an `@context` property set to "https://schema.org"
|
|
18
18
|
* and an `@type` property indicating the type of schema (e.g., Article, Product).
|
|
19
|
-
* The schema falls back to the default schema if it is invalid.
|
|
20
19
|
*/
|
|
21
20
|
schemaMarkup?: WithContext<SupportedSchemaType> | WithContext<SupportedSchemaType>[];
|
|
22
21
|
}
|
|
@@ -488,50 +488,93 @@ var fpmClient = /*#__PURE__*/axiosCacheInterceptor.setupCache(/*#__PURE__*/axios
|
|
|
488
488
|
ttl: /*#__PURE__*/FPM_API_URI.includes('127.0.0.1') || /*#__PURE__*/FPM_API_URI.includes('localhost') ? 0 : 10 * 60 * 1000 // 10 minutes
|
|
489
489
|
});
|
|
490
490
|
|
|
491
|
-
var FALLBACK_LOCALE
|
|
492
|
-
var
|
|
493
|
-
var _ref = /*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee(locale, preview) {
|
|
494
|
-
var cache,
|
|
491
|
+
var FALLBACK_LOCALE = 'en';
|
|
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;
|
|
495
495
|
return _regeneratorRuntime().wrap(function _callee$(_context) {
|
|
496
496
|
while (1) switch (_context.prev = _context.next) {
|
|
497
497
|
case 0:
|
|
498
498
|
if (locale === void 0) {
|
|
499
499
|
locale = 'en';
|
|
500
500
|
}
|
|
501
|
+
if (pLevel === void 0) {
|
|
502
|
+
pLevel = STRAPI_DEFAULT_POPULATE_DEPTH;
|
|
503
|
+
}
|
|
501
504
|
if (preview === void 0) {
|
|
502
505
|
preview = false;
|
|
503
506
|
}
|
|
504
507
|
cache = preview ? false : undefined;
|
|
505
|
-
|
|
506
|
-
pLevel:
|
|
508
|
+
strapiParams = {
|
|
509
|
+
pLevel: pLevel,
|
|
507
510
|
locale: locale,
|
|
508
511
|
'pagination[pageSize]': STRAPI_DEFAULT_PAGE_SIZE,
|
|
509
512
|
status: preview ? 'draft' : 'published'
|
|
510
513
|
};
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
params:
|
|
514
|
+
strapiProjects = new Map();
|
|
515
|
+
_context.prev = 6;
|
|
516
|
+
_context.next = 9;
|
|
517
|
+
return Promise.all([strapiClient.get('/projects', {
|
|
518
|
+
params: strapiParams,
|
|
516
519
|
cache: cache
|
|
517
520
|
}), strapiClient.get('/projects', {
|
|
518
|
-
params: _extends({},
|
|
519
|
-
locale: FALLBACK_LOCALE
|
|
521
|
+
params: _extends({}, strapiParams, {
|
|
522
|
+
locale: FALLBACK_LOCALE
|
|
520
523
|
}),
|
|
521
524
|
cache: cache
|
|
522
525
|
})]);
|
|
523
|
-
case
|
|
526
|
+
case 9:
|
|
524
527
|
_yield$Promise$all = _context.sent;
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
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++) {
|
|
530
532
|
project = _arr[_i];
|
|
531
533
|
if (project.attributes.fpmProjectId) {
|
|
532
534
|
strapiProjects.set(project.attributes.fpmProjectId, project);
|
|
533
535
|
}
|
|
534
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];
|
|
535
578
|
return _context.abrupt("return", fpmProjects.map(function (fpmProject) {
|
|
536
579
|
var _strapiProject$attrib;
|
|
537
580
|
var strapiProject = strapiProjects.get(fpmProject.id);
|
|
@@ -547,7 +590,7 @@ var getPortfolioProjects = /*#__PURE__*/function () {
|
|
|
547
590
|
}
|
|
548
591
|
return toReturn;
|
|
549
592
|
}));
|
|
550
|
-
case
|
|
593
|
+
case 9:
|
|
551
594
|
case "end":
|
|
552
595
|
return _context.stop();
|
|
553
596
|
}
|
|
@@ -957,6 +1000,10 @@ var getSchemaIdentifier = function getSchemaIdentifier(schema) {
|
|
|
957
1000
|
return "offer-" + ((_offer$price = offer.price) != null ? _offer$price : 'unknown-price');
|
|
958
1001
|
case 'WebPage':
|
|
959
1002
|
return getSchemaProperty(schema, 'name') || 'untitled-page';
|
|
1003
|
+
case 'QAPage':
|
|
1004
|
+
return getSchemaProperty(schema, 'name') || 'untitled-qa';
|
|
1005
|
+
case 'SoftwareApplication':
|
|
1006
|
+
return getSchemaProperty(schema, 'name') || 'untitled-software';
|
|
960
1007
|
default:
|
|
961
1008
|
return 'unknown-schema';
|
|
962
1009
|
}
|
|
@@ -969,29 +1016,6 @@ var validateSchema = function validateSchema(schema) {
|
|
|
969
1016
|
}
|
|
970
1017
|
return schema['@context'] === 'https://schema.org' && '@type' in schema;
|
|
971
1018
|
};
|
|
972
|
-
var DEFAULT_SCHEMA = {
|
|
973
|
-
'@context': 'https://schema.org',
|
|
974
|
-
'@type': 'Organization',
|
|
975
|
-
name: 'Tree.ly',
|
|
976
|
-
url: 'https://tree.ly',
|
|
977
|
-
logo: 'https://cdn.tree.ly/logo.png',
|
|
978
|
-
address: {
|
|
979
|
-
'@type': 'PostalAddress',
|
|
980
|
-
streetAddress: 'Littengasse 2b/c',
|
|
981
|
-
addressLocality: 'Dornbirn',
|
|
982
|
-
postalCode: '6850',
|
|
983
|
-
addressRegion: 'Vorarlberg',
|
|
984
|
-
addressCountry: 'AT'
|
|
985
|
-
},
|
|
986
|
-
contactPoint: {
|
|
987
|
-
'@type': 'ContactPoint',
|
|
988
|
-
telephone: '+43-5572-432015',
|
|
989
|
-
contactType: 'Customer Service',
|
|
990
|
-
areaServed: 'AT',
|
|
991
|
-
availableLanguage: ['English', 'German']
|
|
992
|
-
},
|
|
993
|
-
sameAs: ['https://www.linkedin.com/company/tree-ly', 'https://www.facebook.com/treely', 'https://www.instagram.com/treely']
|
|
994
|
-
};
|
|
995
1019
|
var SEOTags = function SEOTags(_ref) {
|
|
996
1020
|
var _shareImage$url, _shareImage$alt;
|
|
997
1021
|
var title = _ref.title,
|
|
@@ -1006,18 +1030,17 @@ var SEOTags = function SEOTags(_ref) {
|
|
|
1006
1030
|
schemaMarkup = _ref.schemaMarkup;
|
|
1007
1031
|
var shareImageUrl = (_shareImage$url = shareImage == null ? void 0 : shareImage.url) != null ? _shareImage$url : DEFAULT_SHARE_IMAGE;
|
|
1008
1032
|
var shareImageAlt = (_shareImage$alt = shareImage == null ? void 0 : shareImage.alt) != null ? _shareImage$alt : DEFAULT_SHARE_ALT;
|
|
1009
|
-
var schemas = schemaMarkup
|
|
1010
|
-
var isValidSchema = validateSchema(
|
|
1033
|
+
var schemas = schemaMarkup;
|
|
1034
|
+
var isValidSchema = schemaMarkup ? validateSchema(schemaMarkup) : false;
|
|
1011
1035
|
if (schemaMarkup && !isValidSchema) {
|
|
1012
|
-
console.warn('Invalid schema markup provided to SEOTags component.
|
|
1013
|
-
schemas =
|
|
1014
|
-
isValidSchema =
|
|
1036
|
+
console.warn('Invalid schema markup provided to SEOTags component. Schema markup will not be rendered.', schemaMarkup);
|
|
1037
|
+
schemas = undefined;
|
|
1038
|
+
isValidSchema = false;
|
|
1015
1039
|
}
|
|
1016
|
-
var schemaArray = Array.isArray(schemas) ? schemas : [schemas];
|
|
1040
|
+
var schemaArray = schemas ? Array.isArray(schemas) ? schemas : [schemas] : [];
|
|
1017
1041
|
var getSchemaKey = function getSchemaKey(schema, index) {
|
|
1018
1042
|
var type = schema['@type'];
|
|
1019
1043
|
var identifier = getSchemaIdentifier(schema);
|
|
1020
|
-
// Add index to ensure uniqueness, especially for fallback identifiers
|
|
1021
1044
|
return type + "-" + identifier + "-" + index;
|
|
1022
1045
|
};
|
|
1023
1046
|
return React__default.default.createElement(Head__default.default, null, React__default.default.createElement("title", null, title + " - " + metaTitleSuffix), React__default.default.createElement("meta", {
|
|
@@ -3657,80 +3680,58 @@ var MAPBOX_MAX_ZOOM = 19;
|
|
|
3657
3680
|
var _templateObject$3;
|
|
3658
3681
|
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"])));
|
|
3659
3682
|
|
|
3660
|
-
var
|
|
3661
|
-
var
|
|
3662
|
-
|
|
3663
|
-
var _bbox$split$map, west, south, east, north, cache, strapiParams, _yield$Promise$all, fpmResponse, strapiProjectsLocalized, strapiProjectsEnglish, strapiProjects, _i, _arr, project, featureCollection;
|
|
3683
|
+
var getFpmProjectsByBbox = /*#__PURE__*/function () {
|
|
3684
|
+
var _ref = /*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee(bbox, preview) {
|
|
3685
|
+
var _bbox$split$map, west, south, east, north, cache, fpmResponse;
|
|
3664
3686
|
return _regeneratorRuntime().wrap(function _callee$(_context) {
|
|
3665
3687
|
while (1) switch (_context.prev = _context.next) {
|
|
3666
3688
|
case 0:
|
|
3667
|
-
if (locale === void 0) {
|
|
3668
|
-
locale = 'en';
|
|
3669
|
-
}
|
|
3670
3689
|
if (preview === void 0) {
|
|
3671
3690
|
preview = false;
|
|
3672
3691
|
}
|
|
3673
3692
|
_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];
|
|
3674
3693
|
cache = preview ? false : undefined;
|
|
3675
|
-
|
|
3676
|
-
|
|
3677
|
-
locale: locale,
|
|
3678
|
-
'pagination[pageSize]': STRAPI_DEFAULT_PAGE_SIZE,
|
|
3679
|
-
status: preview ? 'draft' : 'published'
|
|
3680
|
-
};
|
|
3681
|
-
_context.next = 7;
|
|
3682
|
-
return Promise.all([fpmClient.get('/public/projects', {
|
|
3694
|
+
_context.next = 5;
|
|
3695
|
+
return fpmClient.get('/public/projects', {
|
|
3683
3696
|
params: {
|
|
3684
3697
|
bbox: west + "," + south + "," + east + "," + north
|
|
3685
3698
|
},
|
|
3686
3699
|
cache: cache
|
|
3687
|
-
}), strapiClient.get('/projects', {
|
|
3688
|
-
params: strapiParams,
|
|
3689
|
-
cache: cache
|
|
3690
|
-
}), strapiClient.get('/projects', {
|
|
3691
|
-
params: _extends({}, strapiParams, {
|
|
3692
|
-
locale: FALLBACK_LOCALE
|
|
3693
|
-
}),
|
|
3694
|
-
cache: cache
|
|
3695
|
-
})]);
|
|
3696
|
-
case 7:
|
|
3697
|
-
_yield$Promise$all = _context.sent;
|
|
3698
|
-
fpmResponse = _yield$Promise$all[0];
|
|
3699
|
-
strapiProjectsLocalized = _yield$Promise$all[1].data;
|
|
3700
|
-
strapiProjectsEnglish = _yield$Promise$all[2].data;
|
|
3701
|
-
strapiProjects = new Map();
|
|
3702
|
-
for (_i = 0, _arr = [].concat(strapiProjectsEnglish.data, strapiProjectsLocalized.data); _i < _arr.length; _i++) {
|
|
3703
|
-
project = _arr[_i];
|
|
3704
|
-
if (project.attributes.fpmProjectId) {
|
|
3705
|
-
strapiProjects.set(project.attributes.fpmProjectId, project);
|
|
3706
|
-
}
|
|
3707
|
-
}
|
|
3708
|
-
featureCollection = fpmResponse.data; // Add slug and portfolioHost to each feature's properties
|
|
3709
|
-
featureCollection.features = featureCollection.features.map(function (feature) {
|
|
3710
|
-
var _feature$properties;
|
|
3711
|
-
var fpmProjectId = (_feature$properties = feature.properties) == null ? void 0 : _feature$properties.id;
|
|
3712
|
-
var strapiProject = fpmProjectId ? strapiProjects.get(fpmProjectId) : null;
|
|
3713
|
-
if (strapiProject) {
|
|
3714
|
-
var _strapiProject$attrib;
|
|
3715
|
-
feature.properties = _extends({}, feature.properties, {
|
|
3716
|
-
slug: strapiProject.attributes.slug || undefined,
|
|
3717
|
-
portfolioHost: ((_strapiProject$attrib = strapiProject.attributes.portfolio) == null || (_strapiProject$attrib = _strapiProject$attrib.data) == null ? void 0 : _strapiProject$attrib.attributes.host) || undefined
|
|
3718
|
-
});
|
|
3719
|
-
}
|
|
3720
|
-
return feature;
|
|
3721
3700
|
});
|
|
3722
|
-
|
|
3723
|
-
|
|
3701
|
+
case 5:
|
|
3702
|
+
fpmResponse = _context.sent;
|
|
3703
|
+
return _context.abrupt("return", fpmResponse.data);
|
|
3704
|
+
case 7:
|
|
3724
3705
|
case "end":
|
|
3725
3706
|
return _context.stop();
|
|
3726
3707
|
}
|
|
3727
3708
|
}, _callee);
|
|
3728
3709
|
}));
|
|
3729
|
-
return function
|
|
3710
|
+
return function getFpmProjectsByBbox(_x, _x2) {
|
|
3730
3711
|
return _ref.apply(this, arguments);
|
|
3731
3712
|
};
|
|
3732
3713
|
}();
|
|
3733
3714
|
|
|
3715
|
+
var mergeProjectData = function mergeProjectData(featureCollection, strapiProjects) {
|
|
3716
|
+
// Add slug and portfolioHost to each feature's properties if we have Strapi data
|
|
3717
|
+
var mergedFeatureCollection = _extends({}, featureCollection, {
|
|
3718
|
+
features: featureCollection.features.map(function (feature) {
|
|
3719
|
+
var _feature$properties;
|
|
3720
|
+
var fpmProjectId = (_feature$properties = feature.properties) == null ? void 0 : _feature$properties.id;
|
|
3721
|
+
var strapiProject = fpmProjectId ? strapiProjects.get(fpmProjectId) : null;
|
|
3722
|
+
if (strapiProject) {
|
|
3723
|
+
var _strapiProject$attrib;
|
|
3724
|
+
feature.properties = _extends({}, feature.properties, {
|
|
3725
|
+
slug: strapiProject.attributes.slug || undefined,
|
|
3726
|
+
portfolioHost: ((_strapiProject$attrib = strapiProject.attributes.portfolio) == null || (_strapiProject$attrib = _strapiProject$attrib.data) == null ? void 0 : _strapiProject$attrib.attributes.host) || undefined
|
|
3727
|
+
});
|
|
3728
|
+
}
|
|
3729
|
+
return feature;
|
|
3730
|
+
})
|
|
3731
|
+
});
|
|
3732
|
+
return mergedFeatureCollection;
|
|
3733
|
+
};
|
|
3734
|
+
|
|
3734
3735
|
var projectPinImage = 'https://cdn.jsdelivr.net/npm/@phosphor-icons/core@2.0.2/assets/fill/map-pin-fill.svg';
|
|
3735
3736
|
mapboxgl__default.default.accessToken = MAPBOX_TOKEN;
|
|
3736
3737
|
var FALLBACK_BBOX = '-1.9950830850086163,44.4464186384987,21.995083085002875,54.12644342419196';
|
|
@@ -3753,8 +3754,8 @@ var ProjectsMap = function ProjectsMap(_ref) {
|
|
|
3753
3754
|
isMapReady = _useState3[0],
|
|
3754
3755
|
setIsMapReady = _useState3[1];
|
|
3755
3756
|
var _useState4 = React.useState(null),
|
|
3756
|
-
|
|
3757
|
-
|
|
3757
|
+
strapiProjects = _useState4[0],
|
|
3758
|
+
setStrapiProjects = _useState4[1];
|
|
3758
3759
|
var isBboxContained = React.useCallback(function (innerBbox, outerBbox) {
|
|
3759
3760
|
var _innerBbox$split$map = innerBbox.split(',').map(Number),
|
|
3760
3761
|
innerWest = _innerBbox$split$map[0],
|
|
@@ -3768,39 +3769,71 @@ var ProjectsMap = function ProjectsMap(_ref) {
|
|
|
3768
3769
|
outerNorth = _outerBbox$split$map[3];
|
|
3769
3770
|
return innerWest >= outerWest && innerEast <= outerEast && innerSouth >= outerSouth && innerNorth <= outerNorth;
|
|
3770
3771
|
}, []);
|
|
3772
|
+
var fetchStrapiData = React.useCallback(/*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee() {
|
|
3773
|
+
var data;
|
|
3774
|
+
return _regeneratorRuntime().wrap(function _callee$(_context) {
|
|
3775
|
+
while (1) switch (_context.prev = _context.next) {
|
|
3776
|
+
case 0:
|
|
3777
|
+
if (!strapiProjects) {
|
|
3778
|
+
_context.next = 2;
|
|
3779
|
+
break;
|
|
3780
|
+
}
|
|
3781
|
+
return _context.abrupt("return");
|
|
3782
|
+
case 2:
|
|
3783
|
+
_context.prev = 2;
|
|
3784
|
+
_context.next = 5;
|
|
3785
|
+
return getStrapiProjects(locale, '2');
|
|
3786
|
+
case 5:
|
|
3787
|
+
data = _context.sent;
|
|
3788
|
+
// pLevel = Population depth which is a param in the API request. 2 is enough to get the slug and the portfolioHost
|
|
3789
|
+
setStrapiProjects(data);
|
|
3790
|
+
_context.next = 12;
|
|
3791
|
+
break;
|
|
3792
|
+
case 9:
|
|
3793
|
+
_context.prev = 9;
|
|
3794
|
+
_context.t0 = _context["catch"](2);
|
|
3795
|
+
console.error('❌ Error fetching Strapi projects:', _context.t0);
|
|
3796
|
+
case 12:
|
|
3797
|
+
case "end":
|
|
3798
|
+
return _context.stop();
|
|
3799
|
+
}
|
|
3800
|
+
}, _callee, null, [[2, 9]]);
|
|
3801
|
+
})), [locale, strapiProjects]);
|
|
3771
3802
|
var fetchProjectsData = React.useCallback(/*#__PURE__*/function () {
|
|
3772
|
-
var
|
|
3773
|
-
var
|
|
3774
|
-
return _regeneratorRuntime().wrap(function
|
|
3775
|
-
while (1) switch (
|
|
3803
|
+
var _ref3 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee2(bbox) {
|
|
3804
|
+
var fpmData, mergedData;
|
|
3805
|
+
return _regeneratorRuntime().wrap(function _callee2$(_context2) {
|
|
3806
|
+
while (1) switch (_context2.prev = _context2.next) {
|
|
3776
3807
|
case 0:
|
|
3777
3808
|
setIsLoading(true);
|
|
3778
|
-
|
|
3779
|
-
|
|
3780
|
-
return
|
|
3809
|
+
_context2.prev = 1;
|
|
3810
|
+
_context2.next = 4;
|
|
3811
|
+
return getFpmProjectsByBbox(bbox);
|
|
3781
3812
|
case 4:
|
|
3782
|
-
|
|
3783
|
-
|
|
3784
|
-
|
|
3813
|
+
fpmData = _context2.sent;
|
|
3814
|
+
// If we have Strapi data, merge it, otherwise show FPM data immediately
|
|
3815
|
+
mergedData = strapiProjects ? mergeProjectData(fpmData, strapiProjects) : fpmData;
|
|
3816
|
+
setFeatureCollection(mergedData);
|
|
3817
|
+
_context2.next = 12;
|
|
3785
3818
|
break;
|
|
3786
|
-
case
|
|
3787
|
-
|
|
3788
|
-
|
|
3789
|
-
console.error('Error fetching projects:',
|
|
3790
|
-
case
|
|
3791
|
-
|
|
3819
|
+
case 9:
|
|
3820
|
+
_context2.prev = 9;
|
|
3821
|
+
_context2.t0 = _context2["catch"](1);
|
|
3822
|
+
console.error('Error fetching projects:', _context2.t0);
|
|
3823
|
+
case 12:
|
|
3824
|
+
_context2.prev = 12;
|
|
3792
3825
|
setIsLoading(false);
|
|
3793
|
-
return
|
|
3794
|
-
case
|
|
3826
|
+
return _context2.finish(12);
|
|
3827
|
+
case 15:
|
|
3795
3828
|
case "end":
|
|
3796
|
-
return
|
|
3829
|
+
return _context2.stop();
|
|
3797
3830
|
}
|
|
3798
|
-
},
|
|
3831
|
+
}, _callee2, null, [[1, 9, 12, 15]]);
|
|
3799
3832
|
}));
|
|
3800
3833
|
return function (_x) {
|
|
3801
|
-
return
|
|
3834
|
+
return _ref3.apply(this, arguments);
|
|
3802
3835
|
};
|
|
3803
|
-
}(), []);
|
|
3836
|
+
}(), [strapiProjects]);
|
|
3804
3837
|
var debouncedUpdateBbox = React.useCallback(debounce__default.default(function () {
|
|
3805
3838
|
if (!map.current || !initialBboxRef.current) return;
|
|
3806
3839
|
var bounds = map.current.getBounds();
|
|
@@ -3945,9 +3978,6 @@ var ProjectsMap = function ProjectsMap(_ref) {
|
|
|
3945
3978
|
developer = 'Unknown';
|
|
3946
3979
|
}
|
|
3947
3980
|
var projectUrl = slug && portfolioHost ? portfolioHost + "/portfolio/" + slug : null;
|
|
3948
|
-
console.log('projectUrl', projectUrl);
|
|
3949
|
-
console.log('slug', slug);
|
|
3950
|
-
console.log('portfolioHost', portfolioHost);
|
|
3951
3981
|
var getBadgeMessage = function getBadgeMessage(status) {
|
|
3952
3982
|
switch (status) {
|
|
3953
3983
|
case CreditAvailability.CREDITS_AVAILABLE:
|
|
@@ -4034,10 +4064,8 @@ var ProjectsMap = function ProjectsMap(_ref) {
|
|
|
4034
4064
|
if (slice.defaultCenterCoordinates && slice.defaultZoomLevel) {
|
|
4035
4065
|
initialCenter = [slice.defaultCenterCoordinates.longitude, slice.defaultCenterCoordinates.latitude];
|
|
4036
4066
|
initialZoom = slice.defaultZoomLevel;
|
|
4037
|
-
} else if (userLocation) {
|
|
4038
|
-
initialCenter = [userLocation.lon, userLocation.lat];
|
|
4039
|
-
initialZoom = 10;
|
|
4040
4067
|
} else {
|
|
4068
|
+
// Always start with fallback view - don't wait for user location
|
|
4041
4069
|
var bbox = initialBboxRef.current || FALLBACK_BBOX;
|
|
4042
4070
|
var _bbox$split$map = bbox.split(',').map(Number),
|
|
4043
4071
|
west = _bbox$split$map[0],
|
|
@@ -4059,7 +4087,7 @@ var ProjectsMap = function ProjectsMap(_ref) {
|
|
|
4059
4087
|
map.current.addControl(new mapboxgl__default.default.NavigationControl(), 'top-right');
|
|
4060
4088
|
map.current.on('load', function () {
|
|
4061
4089
|
setIsMapReady(true);
|
|
4062
|
-
if (!(slice.defaultCenterCoordinates && slice.defaultZoomLevel)
|
|
4090
|
+
if (!(slice.defaultCenterCoordinates && slice.defaultZoomLevel)) {
|
|
4063
4091
|
var _map$current5;
|
|
4064
4092
|
var _bbox = initialBboxRef.current || FALLBACK_BBOX;
|
|
4065
4093
|
var _bbox$split$map2 = _bbox.split(',').map(Number),
|
|
@@ -4087,9 +4115,22 @@ var ProjectsMap = function ProjectsMap(_ref) {
|
|
|
4087
4115
|
(_map$current6 = map.current) == null || _map$current6.remove();
|
|
4088
4116
|
map.current = null;
|
|
4089
4117
|
};
|
|
4090
|
-
}, [slice.defaultCenterCoordinates, slice.defaultZoomLevel,
|
|
4118
|
+
}, [slice.defaultCenterCoordinates, slice.defaultZoomLevel, debouncedUpdateBbox]);
|
|
4119
|
+
// Fetch Strapi data once on component mount
|
|
4120
|
+
React.useEffect(function () {
|
|
4121
|
+
fetchStrapiData();
|
|
4122
|
+
}, [fetchStrapiData]);
|
|
4123
|
+
// Handle re-merging data when Strapi data becomes available
|
|
4124
|
+
React.useEffect(function () {
|
|
4125
|
+
if (strapiProjects && featureCollection) {
|
|
4126
|
+
var mergedData = mergeProjectData(featureCollection, strapiProjects);
|
|
4127
|
+
setFeatureCollection(mergedData);
|
|
4128
|
+
}
|
|
4129
|
+
}, [strapiProjects]);
|
|
4130
|
+
// Request user location (non-blocking)
|
|
4091
4131
|
React.useEffect(function () {
|
|
4092
4132
|
if (slice.defaultCenterCoordinates && slice.defaultZoomLevel) {
|
|
4133
|
+
// Use provided default coordinates
|
|
4093
4134
|
var _slice$defaultCenterC = slice.defaultCenterCoordinates,
|
|
4094
4135
|
latitude = _slice$defaultCenterC.latitude,
|
|
4095
4136
|
longitude = _slice$defaultCenterC.longitude;
|
|
@@ -4098,23 +4139,33 @@ var ProjectsMap = function ProjectsMap(_ref) {
|
|
|
4098
4139
|
initialBboxRef.current = bbox;
|
|
4099
4140
|
fetchProjectsData(bbox);
|
|
4100
4141
|
} else if (navigator.geolocation) {
|
|
4142
|
+
// Set fallback immediately (non-blocking)
|
|
4143
|
+
initialBboxRef.current = FALLBACK_BBOX;
|
|
4144
|
+
fetchProjectsData(FALLBACK_BBOX);
|
|
4145
|
+
// Request user location asynchronously
|
|
4101
4146
|
navigator.geolocation.getCurrentPosition(function (position) {
|
|
4102
4147
|
var userLoc = {
|
|
4103
4148
|
lat: position.coords.latitude,
|
|
4104
4149
|
lon: position.coords.longitude
|
|
4105
4150
|
};
|
|
4106
|
-
|
|
4107
|
-
|
|
4108
|
-
|
|
4109
|
-
|
|
4110
|
-
|
|
4151
|
+
if (map.current) {
|
|
4152
|
+
map.current.easeTo({
|
|
4153
|
+
center: [userLoc.lon, userLoc.lat],
|
|
4154
|
+
zoom: 10,
|
|
4155
|
+
duration: 1500
|
|
4156
|
+
});
|
|
4157
|
+
// Update bbox for this location
|
|
4158
|
+
var _buffer = 1;
|
|
4159
|
+
var _bbox2 = userLoc.lon - _buffer + "," + (userLoc.lat - _buffer) + "," + (userLoc.lon + _buffer) + "," + (userLoc.lat + _buffer);
|
|
4160
|
+
initialBboxRef.current = _bbox2;
|
|
4161
|
+
fetchProjectsData(_bbox2);
|
|
4162
|
+
}
|
|
4111
4163
|
}, function () {
|
|
4112
|
-
|
|
4113
|
-
|
|
4114
|
-
fetchProjectsData(FALLBACK_BBOX);
|
|
4164
|
+
// Permission denied or error - already have fallback data loaded
|
|
4165
|
+
// No need to re-fetch since we already loaded FALLBACK_BBOX data
|
|
4115
4166
|
});
|
|
4116
4167
|
} else {
|
|
4117
|
-
|
|
4168
|
+
// Geolocation not supported - use fallback
|
|
4118
4169
|
initialBboxRef.current = FALLBACK_BBOX;
|
|
4119
4170
|
fetchProjectsData(FALLBACK_BBOX);
|
|
4120
4171
|
}
|