@powerportalspro/react-maps 0.0.0-stage → 13.0.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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../node_modules/.pnpm/maplibre-gl@6.15.0/node_modules/maplibre-gl/dist/maplibre-gl.css","../src/core/geo.ts","../src/core/geocoders.ts","../src/core/maplibre-worker.ts","../src/core/styles.ts","../src/core/providers/basemaps.ts","../src/core/providers/maplibre.ts","../src/core/providers/google.ts","../src/core/registry.ts","../src/core/portal-settings.ts","../src/core/address-search.ts","../src/core/map-controller.ts","../src/core/markers.ts","../src/core/theme.ts","../src/core/popup-content.ts","../src/core/popup-snapshot.ts","../src/core/print.ts","../src/core/index.ts","../src/core/near.ts","../src/portal-settings-cache.ts","../src/near-search.tsx","../src/records.ts","../src/map-tables.tsx","../src/map.tsx","../src/grid-map.tsx","../src/maps-provider.tsx"],"names":["feature","document","workerUrl","MapLibreMap","NavigationControl","Marker","held","Supercluster","cluster","element","left","top","width","height","list","googlePlaceFinder","makeStyles","tokens","usePrefixedT","usePowerPortalsPro","useLocale","useState","useEffect","useRef","Popover","jsx","PopoverTrigger","Tooltip","Button","mergeClasses","Location24Filled","Location24Regular","jsxs","PopoverSurface","Label","MyLocation20Regular","Spinner","Text","Field","Dropdown","Option","Dismiss16Regular","ColumnType","readColumnRawValue","resolveColumnDisplayValue","getRecordReferenceId","useMemo","savedViewControl","SavedViewControlKind","useSavedViews","MultiTableViewSchema","useMultiTableViews","EVERY_TABLE_VIEW_ID","useMultiTableTableSet","MultiTableUses","userDefaultViewId","isViewHidden","response","shownViewTables","useSavedViewSession","ViewToolbar","ViewPicker","Subtitle2","ViewFilterMenu","ViewRefreshButton","Fragment","MultiTableFilterDialog","SavedViewDialogs","useStyles","shorthands","recordUrl","useRecordPages","findRecordPage","recordPageUrl","useViewMetadata","useTableMetadata","table","popup","useImperativeHandle","item","useLayoutEffect","MapPrintButton","SharedTooltip","MessageBar","MessageBarBody","Card","Link","Map","forwardRef","AddressMapServiceContext","GridMapRendererContext","GridNearSearchContext","useT","Dialog","DialogSurface","DialogBody","DialogTitle","DialogContent","DialogActions"],"mappings":"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","file":"index.cjs","sourcesContent":[".maplibregl-map{font:12px/20px Helvetica Neue,Arial,Helvetica,sans-serif;overflow:hidden;position:relative;-webkit-tap-highlight-color:rgb(0 0 0/0);-webkit-touch-callout:none}.maplibregl-canvas{position:absolute;left:0;top:0}.maplibregl-map:fullscreen{width:100%;height:100%}.maplibregl-ctrl-group button.maplibregl-ctrl-compass{touch-action:none}.maplibregl-canvas-container.maplibregl-interactive,.maplibregl-ctrl-group button.maplibregl-ctrl-compass{cursor:grab;-webkit-user-select:none;-moz-user-select:none;user-select:none}.maplibregl-canvas-container.maplibregl-interactive.maplibregl-track-pointer{cursor:pointer}.maplibregl-canvas-container.maplibregl-interactive:active,.maplibregl-ctrl-group button.maplibregl-ctrl-compass:active{cursor:grabbing}.maplibregl-canvas-container.maplibregl-touch-zoom-rotate,.maplibregl-canvas-container.maplibregl-touch-zoom-rotate .maplibregl-canvas{touch-action:pan-x pan-y}.maplibregl-canvas-container.maplibregl-touch-drag-pan,.maplibregl-canvas-container.maplibregl-touch-drag-pan .maplibregl-canvas{touch-action:pinch-zoom}.maplibregl-canvas-container.maplibregl-touch-zoom-rotate.maplibregl-touch-drag-pan,.maplibregl-canvas-container.maplibregl-touch-zoom-rotate.maplibregl-touch-drag-pan .maplibregl-canvas{touch-action:none}.maplibregl-canvas-container.maplibregl-touch-drag-pan.maplibregl-cooperative-gestures,.maplibregl-canvas-container.maplibregl-touch-drag-pan.maplibregl-cooperative-gestures .maplibregl-canvas{touch-action:pan-x pan-y}.maplibregl-ctrl-bottom-left,.maplibregl-ctrl-bottom-right,.maplibregl-ctrl-top-left,.maplibregl-ctrl-top-right{position:absolute;pointer-events:none;z-index:2}.maplibregl-ctrl-top-left{top:0;left:0}.maplibregl-ctrl-top-right{top:0;right:0}.maplibregl-ctrl-bottom-left{bottom:0;left:0}.maplibregl-ctrl-bottom-right{right:0;bottom:0}.maplibregl-ctrl{clear:both;pointer-events:auto;transform:translate(0)}.maplibregl-ctrl-top-left .maplibregl-ctrl{margin:10px 0 0 10px;float:left}.maplibregl-ctrl-top-right .maplibregl-ctrl{margin:10px 10px 0 0;float:right}.maplibregl-ctrl-bottom-left .maplibregl-ctrl{margin:0 0 10px 10px;float:left}.maplibregl-ctrl-bottom-right .maplibregl-ctrl{margin:0 10px 10px 0;float:right}.maplibregl-ctrl-group{border-radius:4px;background:#fff}.maplibregl-ctrl-group:not(:empty){box-shadow:0 0 0 2px rgba(0,0,0,.1)}.maplibregl-ctrl-group button{width:29px;height:29px;display:block;padding:0;outline:none;border:0;box-sizing:border-box;background-color:transparent;cursor:pointer}.maplibregl-ctrl button{-webkit-user-select:none;-moz-user-select:none;user-select:none}.maplibregl-ctrl-group button+button{border-top:1px solid #ddd}.maplibregl-ctrl button .maplibregl-ctrl-icon{display:block;width:100%;height:100%;background-repeat:no-repeat;background-position:50%}@media(forced-colors:active){.maplibregl-ctrl-group:not(:empty){box-shadow:0 0 0 2px ButtonText}.maplibregl-ctrl-icon{background-color:transparent}.maplibregl-ctrl-group button+button{border-top:1px solid buttontext}}.maplibregl-ctrl button::-moz-focus-inner{border:0;padding:0}.maplibregl-ctrl-attrib-button:focus,.maplibregl-ctrl-group button:focus{box-shadow:0 0 2px 2px #0096ff}.maplibregl-ctrl button:disabled{cursor:not-allowed}.maplibregl-ctrl button:disabled .maplibregl-ctrl-icon{opacity:.25}@media(hover:hover){.maplibregl-ctrl button:not(:disabled):hover{background-color:rgba(0,0,0,.05)}}.maplibregl-ctrl button:not(:disabled):active{background-color:rgba(0,0,0,.05)}.maplibregl-ctrl-group button:focus:focus-visible{box-shadow:0 0 2px 2px #0096ff}.maplibregl-ctrl-group button:focus:not(:focus-visible){box-shadow:none}.maplibregl-ctrl-group button:focus:first-child{border-radius:4px 4px 0 0}.maplibregl-ctrl-group button:focus:last-child{border-radius:0 0 4px 4px}.maplibregl-ctrl-group button:focus:only-child{border-radius:inherit}.maplibregl-ctrl button.maplibregl-ctrl-zoom-out .maplibregl-ctrl-icon{background-image:url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='29' height='29' viewBox='0 0 29 29' fill='%23333'%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 13z'/%3E %3C/svg%3E\")}.maplibregl-ctrl button.maplibregl-ctrl-zoom-in .maplibregl-ctrl-icon{background-image:url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='29' height='29' viewBox='0 0 29 29' fill='%23333'%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.5'/%3E %3C/svg%3E\")}@media(forced-colors:active){.maplibregl-ctrl button.maplibregl-ctrl-zoom-out .maplibregl-ctrl-icon{background-image:url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='29' height='29' viewBox='0 0 29 29' fill='%23fff'%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 13z'/%3E %3C/svg%3E\")}.maplibregl-ctrl button.maplibregl-ctrl-zoom-in .maplibregl-ctrl-icon{background-image:url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='29' height='29' viewBox='0 0 29 29' fill='%23fff'%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.5'/%3E %3C/svg%3E\")}}@media(forced-colors:active) and (prefers-color-scheme:light){.maplibregl-ctrl button.maplibregl-ctrl-zoom-out .maplibregl-ctrl-icon{background-image:url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='29' height='29' viewBox='0 0 29 29' fill='%23000'%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 13z'/%3E %3C/svg%3E\")}.maplibregl-ctrl button.maplibregl-ctrl-zoom-in .maplibregl-ctrl-icon{background-image:url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='29' height='29' viewBox='0 0 29 29' fill='%23000'%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.5'/%3E %3C/svg%3E\")}}.maplibregl-ctrl button.maplibregl-ctrl-fullscreen .maplibregl-ctrl-icon{background-image:url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='29' height='29' viewBox='0 0 29 29' fill='%23333'%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-3zM6 16l1.5 3 5.5-4 1 1-4 5.5 3 1.5v1H7.5C5.75 24 5 23.25 5 21.5V16zm7-11v1l-3 1.5 4 5.5-1 1-5.5-4L6 13H5V7.5C5 5.75 5.75 5 7.5 5zm11 2.5c0-1.75-.75-2.5-2.5-2.5H16v1l3 1.5-4 5.5 1 1 5.5-4 1.5 3h1z'/%3E %3C/svg%3E\")}.maplibregl-ctrl button.maplibregl-ctrl-shrink .maplibregl-ctrl-icon{background-image:url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='29' height='29' 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-1zM13 18.5c0-1.75-.75-2.5-2.5-2.5H5v1l3 1.5L4 24l1 1 5.5-4 1.5 3h1zm3-8c0 1.75.75 2.5 2.5 2.5H24v-1l-3-1.5L25 5l-1-1-5.5 4L17 5h-1zM10.5 13c1.75 0 2.5-.75 2.5-2.5V5h-1l-1.5 3L5 4 4 5l4 5.5L5 12v1z'/%3E %3C/svg%3E\")}@media(forced-colors:active){.maplibregl-ctrl button.maplibregl-ctrl-fullscreen .maplibregl-ctrl-icon{background-image:url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='29' height='29' viewBox='0 0 29 29' fill='%23fff'%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-3zM6 16l1.5 3 5.5-4 1 1-4 5.5 3 1.5v1H7.5C5.75 24 5 23.25 5 21.5V16zm7-11v1l-3 1.5 4 5.5-1 1-5.5-4L6 13H5V7.5C5 5.75 5.75 5 7.5 5zm11 2.5c0-1.75-.75-2.5-2.5-2.5H16v1l3 1.5-4 5.5 1 1 5.5-4 1.5 3h1z'/%3E %3C/svg%3E\")}.maplibregl-ctrl button.maplibregl-ctrl-shrink .maplibregl-ctrl-icon{background-image:url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='29' height='29' viewBox='0 0 29 29' fill='%23fff'%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-1zM13 18.5c0-1.75-.75-2.5-2.5-2.5H5v1l3 1.5L4 24l1 1 5.5-4 1.5 3h1zm3-8c0 1.75.75 2.5 2.5 2.5H24v-1l-3-1.5L25 5l-1-1-5.5 4L17 5h-1zM10.5 13c1.75 0 2.5-.75 2.5-2.5V5h-1l-1.5 3L5 4 4 5l4 5.5L5 12v1z'/%3E %3C/svg%3E\")}}@media(forced-colors:active) and (prefers-color-scheme:light){.maplibregl-ctrl button.maplibregl-ctrl-fullscreen .maplibregl-ctrl-icon{background-image:url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='29' height='29' viewBox='0 0 29 29' fill='%23000'%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-3zM6 16l1.5 3 5.5-4 1 1-4 5.5 3 1.5v1H7.5C5.75 24 5 23.25 5 21.5V16zm7-11v1l-3 1.5 4 5.5-1 1-5.5-4L6 13H5V7.5C5 5.75 5.75 5 7.5 5zm11 2.5c0-1.75-.75-2.5-2.5-2.5H16v1l3 1.5-4 5.5 1 1 5.5-4 1.5 3h1z'/%3E %3C/svg%3E\")}.maplibregl-ctrl button.maplibregl-ctrl-shrink .maplibregl-ctrl-icon{background-image:url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='29' height='29' viewBox='0 0 29 29' fill='%23000'%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-1zM13 18.5c0-1.75-.75-2.5-2.5-2.5H5v1l3 1.5L4 24l1 1 5.5-4 1.5 3h1zm3-8c0 1.75.75 2.5 2.5 2.5H24v-1l-3-1.5L25 5l-1-1-5.5 4L17 5h-1zM10.5 13c1.75 0 2.5-.75 2.5-2.5V5h-1l-1.5 3L5 4 4 5l4 5.5L5 12v1z'/%3E %3C/svg%3E\")}}.maplibregl-ctrl button.maplibregl-ctrl-compass .maplibregl-ctrl-icon{background-image:url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='29' height='29' viewBox='0 0 29 29' fill='%23333'%3E %3Cpath d='m10.5 14 4-8 4 8z'/%3E %3Cpath fill='%23ccc' d='m10.5 16 4 8 4-8z'/%3E %3C/svg%3E\")}@media(forced-colors:active){.maplibregl-ctrl button.maplibregl-ctrl-compass .maplibregl-ctrl-icon{background-image:url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='29' height='29' viewBox='0 0 29 29' fill='%23fff'%3E %3Cpath d='m10.5 14 4-8 4 8z'/%3E %3Cpath fill='%23ccc' d='m10.5 16 4 8 4-8z'/%3E %3C/svg%3E\")}}@media(forced-colors:active) and (prefers-color-scheme:light){.maplibregl-ctrl button.maplibregl-ctrl-compass .maplibregl-ctrl-icon{background-image:url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='29' height='29' viewBox='0 0 29 29' fill='%23000'%3E %3Cpath d='m10.5 14 4-8 4 8z'/%3E %3Cpath fill='%23ccc' d='m10.5 16 4 8 4-8z'/%3E %3C/svg%3E\")}}.maplibregl-ctrl button.maplibregl-ctrl-globe .maplibregl-ctrl-icon{background-image:url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='22' height='22' fill='none' viewBox='0 0 22 22' stroke='%23333'%3E %3Ccircle cx='11' cy='11' r='8.5'/%3E %3Cpath d='M17.5 11c0 4.819-3.02 8.5-6.5 8.5S4.5 15.819 4.5 11 7.52 2.5 11 2.5s6.5 3.681 6.5 8.5Z'/%3E %3Cpath d='M13.5 11c0 2.447-.331 4.64-.853 6.206-.262.785-.562 1.384-.872 1.777-.314.399-.58.517-.775.517-.195 0-.461-.118-.775-.517-.31-.393-.61-.992-.872-1.777C8.831 15.64 8.5 13.446 8.5 11c0-2.447.331-4.64.853-6.206.262-.785.562-1.384.872-1.777.314-.399.58-.517.775-.517.195 0 .461.118.775.517.31.393.61.992.872 1.777.522 1.565.853 3.76.853 6.206Z'/%3E %3Cpath d='M11 7.5c-1.909 0-3.622-.166-4.845-.428-.616-.132-1.08-.283-1.379-.434a1.333 1.333 0 0 1-.224-.138c.047-.038.12-.085.224-.138.299-.151.763-.302 1.379-.434C7.378 5.666 9.091 5.5 11 5.5c1.909 0 3.622.166 4.845.428.616.132 1.08.283 1.379.434.105.053.177.1.224.138-.047.038-.12.085-.224.138-.299.151-.763.302-1.379.434-1.223.262-2.936.428-4.845.428ZM4.486 6.436ZM11 16.5c-1.909 0-3.622-.166-4.845-.428-.616-.132-1.08-.283-1.379-.434a1.33 1.33 0 0 1-.224-.138 1.33 1.33 0 0 1 .224-.138c.299-.151.763-.302 1.379-.434C7.378 14.666 9.091 14.5 11 14.5c1.909 0 3.622.166 4.845.428.616.132 1.08.283 1.379.434.105.053.177.1.224.138a1.33 1.33 0 0 1-.224.138c-.299.151-.763.302-1.379.434-1.223.262-2.936.428-4.845.428Zm-6.514-1.064ZM11 12.5c-2.46 0-4.672-.222-6.255-.574-.796-.177-1.406-.38-1.805-.59a1.465 1.465 0 0 1-.39-.272.293.293 0 0 1-.047-.064.293.293 0 0 1 .048-.064c.066-.073.189-.167.389-.272.399-.21 1.009-.413 1.805-.59C6.328 9.722 8.54 9.5 11 9.5s4.672.222 6.256.574c.795.177 1.405.38 1.804.59.2.105.323.2.39.272a.33.33 0 0 1 .047.064.293.293 0 0 1-.048.064 1.435 1.435 0 0 1-.389.272c-.399.21-1.009.413-1.804.59-1.584.352-3.796.574-6.256.574Zm-8.501-1.51v.002-.002Zm0 .018v.002-.002Zm17.002.002v-.002.002Zm0-.018v-.002.002Z'/%3E %3C/svg%3E\")}.maplibregl-ctrl button.maplibregl-ctrl-globe-enabled .maplibregl-ctrl-icon{background-image:url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='22' height='22' fill='none' viewBox='0 0 22 22' stroke='%2333b5e5'%3E %3Ccircle cx='11' cy='11' r='8.5'/%3E %3Cpath d='M17.5 11c0 4.819-3.02 8.5-6.5 8.5S4.5 15.819 4.5 11 7.52 2.5 11 2.5s6.5 3.681 6.5 8.5Z'/%3E %3Cpath d='M13.5 11c0 2.447-.331 4.64-.853 6.206-.262.785-.562 1.384-.872 1.777-.314.399-.58.517-.775.517-.195 0-.461-.118-.775-.517-.31-.393-.61-.992-.872-1.777C8.831 15.64 8.5 13.446 8.5 11c0-2.447.331-4.64.853-6.206.262-.785.562-1.384.872-1.777.314-.399.58-.517.775-.517.195 0 .461.118.775.517.31.393.61.992.872 1.777.522 1.565.853 3.76.853 6.206Z'/%3E %3Cpath d='M11 7.5c-1.909 0-3.622-.166-4.845-.428-.616-.132-1.08-.283-1.379-.434a1.333 1.333 0 0 1-.224-.138c.047-.038.12-.085.224-.138.299-.151.763-.302 1.379-.434C7.378 5.666 9.091 5.5 11 5.5c1.909 0 3.622.166 4.845.428.616.132 1.08.283 1.379.434.105.053.177.1.224.138-.047.038-.12.085-.224.138-.299.151-.763.302-1.379.434-1.223.262-2.936.428-4.845.428ZM4.486 6.436ZM11 16.5c-1.909 0-3.622-.166-4.845-.428-.616-.132-1.08-.283-1.379-.434a1.33 1.33 0 0 1-.224-.138 1.33 1.33 0 0 1 .224-.138c.299-.151.763-.302 1.379-.434C7.378 14.666 9.091 14.5 11 14.5c1.909 0 3.622.166 4.845.428.616.132 1.08.283 1.379.434.105.053.177.1.224.138a1.33 1.33 0 0 1-.224.138c-.299.151-.763.302-1.379.434-1.223.262-2.936.428-4.845.428Zm-6.514-1.064ZM11 12.5c-2.46 0-4.672-.222-6.255-.574-.796-.177-1.406-.38-1.805-.59a1.465 1.465 0 0 1-.39-.272.293.293 0 0 1-.047-.064.293.293 0 0 1 .048-.064c.066-.073.189-.167.389-.272.399-.21 1.009-.413 1.805-.59C6.328 9.722 8.54 9.5 11 9.5s4.672.222 6.256.574c.795.177 1.405.38 1.804.59.2.105.323.2.39.272a.33.33 0 0 1 .047.064.293.293 0 0 1-.048.064 1.435 1.435 0 0 1-.389.272c-.399.21-1.009.413-1.804.59-1.584.352-3.796.574-6.256.574Zm-8.501-1.51v.002-.002Zm0 .018v.002-.002Zm17.002.002v-.002.002Zm0-.018v-.002.002Z'/%3E %3C/svg%3E\")}.maplibregl-ctrl button.maplibregl-ctrl-terrain .maplibregl-ctrl-icon{background-image:url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='22' height='22' viewBox='0 0 22 22' fill='%23333'%3E %3Cpath d='m1.754 13.406 4.453-4.851 3.09 3.09 3.281 3.277.969-.969-3.309-3.312 3.844-4.121 6.148 6.886h1.082v-.855l-7.207-8.07-4.84 5.187L6.169 6.57l-5.48 5.965v.871ZM.688 16.844h20.625v1.375H.688Zm0 0'/%3E %3C/svg%3E\")}.maplibregl-ctrl button.maplibregl-ctrl-terrain-enabled .maplibregl-ctrl-icon{background-image:url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='22' height='22' viewBox='0 0 22 22' fill='%2333b5e5'%3E %3Cpath d='m1.754 13.406 4.453-4.851 3.09 3.09 3.281 3.277.969-.969-3.309-3.312 3.844-4.121 6.148 6.886h1.082v-.855l-7.207-8.07-4.84 5.187L6.169 6.57l-5.48 5.965v.871ZM.688 16.844h20.625v1.375H.688Zm0 0'/%3E %3C/svg%3E\")}.maplibregl-ctrl button.maplibregl-ctrl-geolocate .maplibregl-ctrl-icon{background-image:url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='29' height='29' viewBox='0 0 20 20' 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-1m0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7'/%3E %3Ccircle id='dot' cx='10' cy='10' r='2'/%3E %3Cpath id='stroke' d='m14 5 1 1-9 9-1-1z' display='none'/%3E %3C/svg%3E\")}.maplibregl-ctrl button.maplibregl-ctrl-geolocate:disabled .maplibregl-ctrl-icon{background-image:url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='29' height='29' viewBox='0 0 20 20' 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-1m0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7'/%3E %3Ccircle id='dot' cx='10' cy='10' r='2'/%3E %3Cpath id='stroke' d='m14 5 1 1-9 9-1-1z' fill='%23f00'/%3E %3C/svg%3E\")}.maplibregl-ctrl button.maplibregl-ctrl-geolocate.maplibregl-ctrl-geolocate-active .maplibregl-ctrl-icon{background-image:url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='29' height='29' viewBox='0 0 20 20' 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-1m0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7'/%3E %3Ccircle id='dot' cx='10' cy='10' r='2'/%3E %3Cpath id='stroke' d='m14 5 1 1-9 9-1-1z' display='none'/%3E %3C/svg%3E\")}.maplibregl-ctrl button.maplibregl-ctrl-geolocate.maplibregl-ctrl-geolocate-active-error .maplibregl-ctrl-icon{background-image:url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='29' height='29' viewBox='0 0 20 20' 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-1m0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7'/%3E %3Ccircle id='dot' cx='10' cy='10' r='2'/%3E %3Cpath id='stroke' d='m14 5 1 1-9 9-1-1z' display='none'/%3E %3C/svg%3E\")}.maplibregl-ctrl button.maplibregl-ctrl-geolocate.maplibregl-ctrl-geolocate-background .maplibregl-ctrl-icon{background-image:url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='29' height='29' viewBox='0 0 20 20' 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-1m0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7'/%3E %3Ccircle id='dot' cx='10' cy='10' r='2' display='none'/%3E %3Cpath id='stroke' d='m14 5 1 1-9 9-1-1z' display='none'/%3E %3C/svg%3E\")}.maplibregl-ctrl button.maplibregl-ctrl-geolocate.maplibregl-ctrl-geolocate-background-error .maplibregl-ctrl-icon{background-image:url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='29' height='29' viewBox='0 0 20 20' 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-1m0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7'/%3E %3Ccircle id='dot' cx='10' cy='10' r='2' display='none'/%3E %3Cpath id='stroke' d='m14 5 1 1-9 9-1-1z' display='none'/%3E %3C/svg%3E\")}.maplibregl-ctrl button.maplibregl-ctrl-geolocate.maplibregl-ctrl-geolocate-waiting .maplibregl-ctrl-icon{animation:maplibregl-spin 2s linear infinite}@media(forced-colors:active){.maplibregl-ctrl button.maplibregl-ctrl-geolocate .maplibregl-ctrl-icon{background-image:url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='29' height='29' viewBox='0 0 20 20' 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-1m0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7'/%3E %3Ccircle id='dot' cx='10' cy='10' r='2'/%3E %3Cpath id='stroke' d='m14 5 1 1-9 9-1-1z' display='none'/%3E %3C/svg%3E\")}.maplibregl-ctrl button.maplibregl-ctrl-geolocate:disabled .maplibregl-ctrl-icon{background-image:url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='29' height='29' viewBox='0 0 20 20' 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-1m0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7'/%3E %3Ccircle id='dot' cx='10' cy='10' r='2'/%3E %3Cpath id='stroke' d='m14 5 1 1-9 9-1-1z' fill='%23f00'/%3E %3C/svg%3E\")}.maplibregl-ctrl button.maplibregl-ctrl-geolocate.maplibregl-ctrl-geolocate-active .maplibregl-ctrl-icon{background-image:url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='29' height='29' viewBox='0 0 20 20' 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-1m0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7'/%3E %3Ccircle id='dot' cx='10' cy='10' r='2'/%3E %3Cpath id='stroke' d='m14 5 1 1-9 9-1-1z' display='none'/%3E %3C/svg%3E\")}.maplibregl-ctrl button.maplibregl-ctrl-geolocate.maplibregl-ctrl-geolocate-active-error .maplibregl-ctrl-icon{background-image:url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='29' height='29' viewBox='0 0 20 20' 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-1m0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7'/%3E %3Ccircle id='dot' cx='10' cy='10' r='2'/%3E %3Cpath id='stroke' d='m14 5 1 1-9 9-1-1z' display='none'/%3E %3C/svg%3E\")}.maplibregl-ctrl button.maplibregl-ctrl-geolocate.maplibregl-ctrl-geolocate-background .maplibregl-ctrl-icon{background-image:url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='29' height='29' viewBox='0 0 20 20' 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-1m0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7'/%3E %3Ccircle id='dot' cx='10' cy='10' r='2' display='none'/%3E %3Cpath id='stroke' d='m14 5 1 1-9 9-1-1z' display='none'/%3E %3C/svg%3E\")}.maplibregl-ctrl button.maplibregl-ctrl-geolocate.maplibregl-ctrl-geolocate-background-error .maplibregl-ctrl-icon{background-image:url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='29' height='29' viewBox='0 0 20 20' 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-1m0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7'/%3E %3Ccircle id='dot' cx='10' cy='10' r='2' display='none'/%3E %3Cpath id='stroke' d='m14 5 1 1-9 9-1-1z' display='none'/%3E %3C/svg%3E\")}}@media(forced-colors:active) and (prefers-color-scheme:light){.maplibregl-ctrl button.maplibregl-ctrl-geolocate .maplibregl-ctrl-icon{background-image:url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='29' height='29' viewBox='0 0 20 20' 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-1m0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7'/%3E %3Ccircle id='dot' cx='10' cy='10' r='2'/%3E %3Cpath id='stroke' d='m14 5 1 1-9 9-1-1z' display='none'/%3E %3C/svg%3E\")}.maplibregl-ctrl button.maplibregl-ctrl-geolocate:disabled .maplibregl-ctrl-icon{background-image:url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='29' height='29' viewBox='0 0 20 20' 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-1m0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7'/%3E %3Ccircle id='dot' cx='10' cy='10' r='2'/%3E %3Cpath id='stroke' d='m14 5 1 1-9 9-1-1z' fill='%23f00'/%3E %3C/svg%3E\")}}@keyframes maplibregl-spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}a.maplibregl-ctrl-logo{width:88px;height:23px;margin:0 0 -4px -4px;display:block;background-repeat:no-repeat;cursor:pointer;overflow:hidden;background-image:url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='88' height='23' fill='none'%3E %3Cpath fill='%23000' fill-opacity='.4' fill-rule='evenodd' d='M17.408 16.796h-1.827l2.501-12.095h.198l3.324 6.533.988 2.19.988-2.19 3.258-6.533h.181l2.6 12.095h-1.81l-1.218-5.644-.362-1.71-.658 1.71-2.929 5.644h-.098l-2.914-5.644-.757-1.71-.345 1.71zm1.958-3.42-.726 3.663a1.255 1.255 0 0 1-1.232 1.011h-1.827a1.255 1.255 0 0 1-1.229-1.509l2.501-12.095a1.255 1.255 0 0 1 1.23-1.001h.197a1.25 1.25 0 0 1 1.12.685l3.19 6.273 3.125-6.263a1.25 1.25 0 0 1 1.123-.695h.181a1.255 1.255 0 0 1 1.227.991l1.443 6.71a5 5 0 0 1 .314-.787l.009-.016a4.6 4.6 0 0 1 1.777-1.887c.782-.46 1.668-.667 2.611-.667a4.6 4.6 0 0 1 1.7.32l.306.134c.21-.16.474-.256.759-.256h1.694a1.255 1.255 0 0 1 1.212.925 1.255 1.255 0 0 1 1.212-.925h1.711c.284 0 .545.094.755.252.613-.3 1.312-.45 2.075-.45 1.356 0 2.557.445 3.482 1.4q.47.48.763 1.064V4.701a1.255 1.255 0 0 1 1.255-1.255h1.86A1.255 1.255 0 0 1 54.44 4.7v9.194h2.217c.19 0 .37.043.532.118v-4.77c0-.356.147-.678.385-.906a2.42 2.42 0 0 1-.682-1.71c0-.665.267-1.253.735-1.7a2.45 2.45 0 0 1 1.722-.674 2.43 2.43 0 0 1 1.705.675q.318.302.504.683V4.7a1.255 1.255 0 0 1 1.255-1.255h1.744A1.255 1.255 0 0 1 65.812 4.7v3.335a4.8 4.8 0 0 1 1.526-.246c.938 0 1.817.214 2.59.69a4.47 4.47 0 0 1 1.67 1.743v-.98a1.255 1.255 0 0 1 1.256-1.256h1.777c.233 0 .451.064.639.174a3.4 3.4 0 0 1 1.567-.372c.346 0 .861.02 1.285.232a1.25 1.25 0 0 1 .689 1.004 4.7 4.7 0 0 1 .853-.588c.795-.44 1.675-.647 2.61-.647 1.385 0 2.65.39 3.525 1.396.836.938 1.168 2.173 1.168 3.528q-.001.515-.056 1.051a1.255 1.255 0 0 1-.947 1.09l.408.952a1.255 1.255 0 0 1-.477 1.552c-.418.268-.92.463-1.458.612-.613.171-1.304.244-2.049.244-1.06 0-2.043-.207-2.886-.698l-.015-.008c-.798-.48-1.419-1.135-1.818-1.963l-.004-.008a5.8 5.8 0 0 1-.548-2.512q0-.429.053-.843a1.3 1.3 0 0 1-.333-.086l-.166-.004c-.223 0-.426.062-.643.228-.03.024-.142.139-.142.59v3.883a1.255 1.255 0 0 1-1.256 1.256h-1.777a1.255 1.255 0 0 1-1.256-1.256V15.69l-.032.057a4.8 4.8 0 0 1-1.86 1.833 5.04 5.04 0 0 1-2.484.634 4.5 4.5 0 0 1-1.935-.424 1.25 1.25 0 0 1-.764.258h-1.71a1.255 1.255 0 0 1-1.256-1.255V7.687a2.4 2.4 0 0 1-.428.625c.253.23.412.561.412.93v7.553a1.255 1.255 0 0 1-1.256 1.255h-1.843a1.25 1.25 0 0 1-.894-.373c-.228.23-.544.373-.894.373H51.32a1.255 1.255 0 0 1-1.256-1.255v-1.251l-.061.117a4.7 4.7 0 0 1-1.782 1.884 4.77 4.77 0 0 1-2.485.67 5.6 5.6 0 0 1-1.485-.188l.009 2.764a1.255 1.255 0 0 1-1.255 1.259h-1.729a1.255 1.255 0 0 1-1.255-1.255v-3.537a1.255 1.255 0 0 1-1.167.793h-1.679a1.25 1.25 0 0 1-.77-.263 4.5 4.5 0 0 1-1.945.429c-.885 0-1.724-.21-2.495-.632l-.017-.01a5 5 0 0 1-1.081-.836 1.255 1.255 0 0 1-1.254 1.312h-1.81a1.255 1.255 0 0 1-1.228-.99l-.782-3.625-2.044 3.939a1.25 1.25 0 0 1-1.115.676h-.098a1.25 1.25 0 0 1-1.116-.68l-2.061-3.994zM35.92 16.63l.207-.114.223-.15q.493-.356.735-.785l.061-.118.033 1.332h1.678V9.242h-1.694l-.033 1.267q-.133-.329-.526-.658l-.032-.028a3.2 3.2 0 0 0-.668-.428l-.27-.12a3.3 3.3 0 0 0-1.235-.23q-1.136-.001-1.974.493a3.36 3.36 0 0 0-1.3 1.382q-.445.89-.444 2.074 0 1.2.51 2.107a3.8 3.8 0 0 0 1.382 1.381 3.9 3.9 0 0 0 1.893.477q.795 0 1.455-.33zm-2.789-5.38q-.576.675-.575 1.762 0 1.102.559 1.794.576.675 1.645.675a2.25 2.25 0 0 0 .934-.19 2.2 2.2 0 0 0 .468-.29l.178-.161a2.2 2.2 0 0 0 .397-.561q.244-.5.244-1.15v-.115q0-.708-.296-1.267l-.043-.077a2.2 2.2 0 0 0-.633-.709l-.13-.086-.047-.028a2.1 2.1 0 0 0-1.073-.285q-1.052 0-1.629.692zm2.316 2.706c.163-.17.28-.407.28-.83v-.114c0-.292-.06-.508-.15-.68a.96.96 0 0 0-.353-.389.85.85 0 0 0-.464-.127c-.4 0-.56.114-.664.239l-.01.012c-.148.174-.275.45-.275.945 0 .506.122.801.27.99.097.11.266.224.68.224.303 0 .504-.09.687-.269zm7.545 1.705a2.6 2.6 0 0 0 .331.423q.319.33.755.548l.173.074q.65.255 1.49.255 1.02 0 1.844-.493a3.45 3.45 0 0 0 1.316-1.4q.493-.904.493-2.089 0-1.909-.988-2.913-.988-1.02-2.584-1.02-.898 0-1.575.347a3 3 0 0 0-.415.262l-.199.166a3.4 3.4 0 0 0-.64.82V9.242h-1.712v11.553h1.729l-.017-5.134zm.53-1.138q.206.29.48.5l.155.11.053.034q.51.296 1.119.297 1.07 0 1.645-.675.577-.69.576-1.762 0-1.119-.576-1.777-.558-.675-1.645-.675-.435 0-.835.16a2 2 0 0 0-.284.136 2 2 0 0 0-.363.254 2.2 2.2 0 0 0-.46.569l-.082.162a2.6 2.6 0 0 0-.213 1.072v.115q0 .707.296 1.267l.135.211zm.964-.818a1.1 1.1 0 0 0 .367.385.94.94 0 0 0 .476.118c.423 0 .59-.117.687-.23.159-.194.28-.478.28-.95 0-.53-.133-.8-.266-.952l-.021-.025c-.078-.094-.231-.221-.68-.221a1 1 0 0 0-.503.135l-.012.007a.86.86 0 0 0-.335.343c-.073.133-.132.324-.132.614v.115a1.4 1.4 0 0 0 .14.66zm15.7-6.222q.347-.346.346-.856a1.05 1.05 0 0 0-.345-.79 1.18 1.18 0 0 0-.84-.329q-.51 0-.855.33a1.05 1.05 0 0 0-.346.79q0 .51.346.855.345.346.856.346.51 0 .839-.346zm4.337 9.314.033-1.332q.191.403.59.747l.098.081a4 4 0 0 0 .316.224l.223.122a3.2 3.2 0 0 0 1.44.322 3.8 3.8 0 0 0 1.875-.477 3.5 3.5 0 0 0 1.382-1.366q.527-.89.526-2.09 0-1.184-.444-2.073a3.24 3.24 0 0 0-1.283-1.399q-.823-.51-1.942-.51a3.5 3.5 0 0 0-1.527.344l-.086.043-.165.09a3 3 0 0 0-.33.214q-.432.315-.656.707a2 2 0 0 0-.099.198l.082-1.283V4.701h-1.744v12.095zm.473-2.509a2.5 2.5 0 0 0 .566.7q.117.098.245.18l.144.08a2.1 2.1 0 0 0 .975.232q1.07 0 1.645-.675.576-.69.576-1.778 0-1.102-.576-1.777-.56-.691-1.645-.692a2.2 2.2 0 0 0-1.015.235q-.22.113-.415.282l-.15.142a2.1 2.1 0 0 0-.42.594q-.223.479-.223 1.1v.115q0 .705.293 1.26zm2.616-.293c.157-.191.28-.479.28-.967 0-.51-.13-.79-.276-.961l-.021-.026c-.082-.1-.232-.225-.67-.225a.87.87 0 0 0-.681.279l-.012.011c-.154.155-.274.38-.274.807v.115c0 .285.057.499.144.669a1.1 1.1 0 0 0 .367.405c.137.082.28.123.455.123.423 0 .59-.118.686-.23zm8.266-3.013q.345-.13.724-.14l.069-.002q.493 0 .642.099l.247-1.794q-.196-.099-.717-.099a2.3 2.3 0 0 0-.545.063 2 2 0 0 0-.411.148 2.2 2.2 0 0 0-.4.249 2.5 2.5 0 0 0-.485.499 2.7 2.7 0 0 0-.32.581l-.05.137v-1.48h-1.778v7.553h1.777v-3.884q0-.546.159-.943a1.5 1.5 0 0 1 .466-.636 2.5 2.5 0 0 1 .399-.253 2 2 0 0 1 .224-.099zm9.784 2.656.05-.922q0-1.743-.856-2.698-.838-.97-2.584-.97-1.119-.001-2.007.493a3.46 3.46 0 0 0-1.4 1.382q-.493.906-.493 2.106 0 1.07.428 1.975.428.89 1.332 1.432.906.526 2.255.526.973 0 1.668-.185l.044-.012.135-.04q.613-.184.984-.421l-.542-1.267q-.3.162-.642.274l-.297.087q-.51.131-1.3.131-.954 0-1.497-.444a1.6 1.6 0 0 1-.192-.193q-.366-.44-.512-1.234l-.004-.021zm-5.427-1.256-.003.022h3.752v-.138q-.011-.727-.288-1.118a1 1 0 0 0-.156-.176q-.46-.428-1.316-.428-.986 0-1.494.604-.379.45-.494 1.234zm-27.053 2.77V4.7h-1.86v12.095h5.333V15.15zm7.103-5.908v7.553h-1.843V9.242h1.843z'/%3E %3Cpath fill='%23fff' d='m19.63 11.151-.757-1.71-.345 1.71-1.12 5.644h-1.827L18.083 4.7h.197l3.325 6.533.988 2.19.988-2.19L26.839 4.7h.181l2.6 12.095h-1.81l-1.218-5.644-.362-1.71-.658 1.71-2.93 5.644h-.098l-2.913-5.644zm14.836 5.81q-1.02 0-1.893-.478a3.8 3.8 0 0 1-1.381-1.382q-.51-.906-.51-2.106 0-1.185.444-2.074a3.36 3.36 0 0 1 1.3-1.382q.839-.494 1.974-.494a3.3 3.3 0 0 1 1.234.231 3.3 3.3 0 0 1 .97.575q.396.33.527.659l.033-1.267h1.694v7.553H37.18l-.033-1.332q-.279.593-1.02 1.053a3.17 3.17 0 0 1-1.662.444zm.296-1.482q.938 0 1.58-.642.642-.66.642-1.711v-.115q0-.708-.296-1.267a2.2 2.2 0 0 0-.807-.872 2.1 2.1 0 0 0-1.119-.313q-1.053 0-1.629.692-.575.675-.575 1.76 0 1.103.559 1.795.577.675 1.645.675zm6.521-6.237h1.711v1.4q.906-1.597 2.83-1.597 1.596 0 2.584 1.02.988 1.005.988 2.914 0 1.185-.493 2.09a3.46 3.46 0 0 1-1.316 1.399 3.5 3.5 0 0 1-1.844.493q-.954 0-1.662-.329a2.67 2.67 0 0 1-1.086-.97l.017 5.134h-1.728zm4.048 6.22q1.07 0 1.645-.674.577-.69.576-1.762 0-1.119-.576-1.777-.558-.675-1.645-.675-.592 0-1.12.296-.51.28-.822.823-.296.527-.296 1.234v.115q0 .708.296 1.267.313.543.823.855.51.296 1.119.297z'/%3E %3Cpath fill='%23e1e3e9' d='M51.325 4.7h1.86v10.45h3.473v1.646h-5.333zm7.12 4.542h1.843v7.553h-1.843zm.905-1.415a1.16 1.16 0 0 1-.856-.346 1.17 1.17 0 0 1-.346-.856 1.05 1.05 0 0 1 .346-.79q.346-.329.856-.329.494 0 .839.33a1.05 1.05 0 0 1 .345.79 1.16 1.16 0 0 1-.345.855q-.33.346-.84.346zm7.875 9.133a3.17 3.17 0 0 1-1.662-.444q-.723-.46-1.004-1.053l-.033 1.332h-1.71V4.701h1.743v4.657l-.082 1.283q.279-.658 1.086-1.119a3.5 3.5 0 0 1 1.778-.477q1.119 0 1.942.51a3.24 3.24 0 0 1 1.283 1.4q.445.888.444 2.072 0 1.201-.526 2.09a3.5 3.5 0 0 1-1.382 1.366 3.8 3.8 0 0 1-1.876.477zm-.296-1.481q1.069 0 1.645-.675.577-.69.577-1.778 0-1.102-.577-1.776-.56-.691-1.645-.692a2.12 2.12 0 0 0-1.58.659q-.642.641-.642 1.694v.115q0 .71.296 1.267a2.4 2.4 0 0 0 .807.872 2.1 2.1 0 0 0 1.119.313zm5.927-6.237h1.777v1.481q.263-.757.856-1.217a2.14 2.14 0 0 1 1.349-.46q.527 0 .724.098l-.247 1.794q-.149-.099-.642-.099-.774 0-1.416.494-.626.493-.626 1.58v3.883h-1.777V9.242zm9.534 7.718q-1.35 0-2.255-.526-.904-.543-1.332-1.432a4.6 4.6 0 0 1-.428-1.975q0-1.2.493-2.106a3.46 3.46 0 0 1 1.4-1.382q.889-.495 2.007-.494 1.744 0 2.584.97.855.956.856 2.7 0 .444-.05.92h-5.43q.18 1.005.708 1.45.542.443 1.497.443.79 0 1.3-.131a4 4 0 0 0 .938-.362l.542 1.267q-.411.263-1.119.46-.708.198-1.711.197zm1.596-4.558q.016-1.02-.444-1.432-.46-.428-1.316-.428-1.728 0-1.991 1.86z'/%3E %3Cpath d='M5.074 15.948a.484.657 0 0 0-.486.659v1.84a.484.657 0 0 0 .486.659h4.101a.484.657 0 0 0 .486-.659v-1.84a.484.657 0 0 0-.486-.659zm3.56 1.16H5.617v.838h3.017z' style='fill:%23fff;fill-rule:evenodd;stroke-width:1.03600001'/%3E %3Cg style='stroke-width:1.12603545'%3E %3Cpath d='M-9.408-1.416c-3.833-.025-7.056 2.912-7.08 6.615-.02 3.08 1.653 4.832 3.107 6.268.903.892 1.721 1.74 2.32 2.902l-.525-.004c-.543-.003-.992.304-1.24.639a1.87 1.87 0 0 0-.362 1.121l-.011 1.877c-.003.402.104.787.347 1.125.244.338.688.653 1.23.656l4.142.028c.542.003.99-.306 1.238-.641a1.87 1.87 0 0 0 .363-1.121l.012-1.875a1.87 1.87 0 0 0-.348-1.127c-.243-.338-.688-.653-1.23-.656l-.518-.004c.597-1.145 1.425-1.983 2.348-2.87 1.473-1.414 3.18-3.149 3.2-6.226-.016-3.59-2.923-6.684-6.993-6.707m-.006 1.1v.002c3.274.02 5.92 2.532 5.9 5.6-.017 2.706-1.39 4.026-2.863 5.44-1.034.994-2.118 2.033-2.814 3.633-.018.041-.052.055-.075.065q-.013.004-.02.01a.34.34 0 0 1-.226.084.34.34 0 0 1-.224-.086l-.092-.077c-.699-1.615-1.768-2.669-2.781-3.67-1.454-1.435-2.797-2.762-2.78-5.478.02-3.067 2.7-5.545 5.975-5.523m-.02 2.826c-1.62-.01-2.944 1.315-2.955 2.96-.01 1.646 1.295 2.988 2.916 2.999h.002c1.621.01 2.943-1.316 2.953-2.961.011-1.646-1.294-2.988-2.916-2.998m-.005 1.1c1.017.006 1.829.83 1.822 1.89s-.83 1.874-1.848 1.867c-1.018-.006-1.829-.83-1.822-1.89s.83-1.874 1.848-1.868m-2.155 11.857 4.14.025c.271.002.49.305.487.676l-.013 1.875c-.003.37-.224.67-.495.668l-4.14-.025c-.27-.002-.487-.306-.485-.676l.012-1.875c.003-.37.224-.67.494-.668' style='color:%23000;font-style:normal;font-variant:normal;font-weight:400;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:%23000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:evenodd;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:%23000;solid-opacity:1;vector-effect:none;fill:%23000;fill-opacity:.4;fill-rule:evenodd;stroke:none;stroke-width:2.47727823;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto' transform='translate(15.553 2.85)scale(.88807)'/%3E %3Cpath d='M-9.415-.316C-12.69-.338-15.37 2.14-15.39 5.207c-.017 2.716 1.326 4.041 2.78 5.477 1.013 1 2.081 2.055 2.78 3.67l.092.076a.34.34 0 0 0 .225.086.34.34 0 0 0 .227-.083l.019-.01c.022-.009.057-.024.074-.064.697-1.6 1.78-2.64 2.814-3.634 1.473-1.414 2.847-2.733 2.864-5.44.02-3.067-2.627-5.58-5.901-5.601m-.057 8.784c1.621.011 2.944-1.315 2.955-2.96.01-1.646-1.295-2.988-2.916-2.999-1.622-.01-2.945 1.315-2.955 2.96s1.295 2.989 2.916 3' style='clip-rule:evenodd;fill:%23e1e3e9;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.47727823;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:.4' transform='translate(15.553 2.85)scale(.88807)'/%3E %3Cpath d='M-11.594 15.465c-.27-.002-.492.297-.494.668l-.012 1.876c-.003.371.214.673.485.675l4.14.027c.271.002.492-.298.495-.668l.012-1.877c.003-.37-.215-.672-.485-.674z' style='clip-rule:evenodd;fill:%23fff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.47727823;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:.4' transform='translate(15.553 2.85)scale(.88807)'/%3E %3C/g%3E %3C/svg%3E\")}a.maplibregl-ctrl-logo.maplibregl-compact{width:14px}@media(forced-colors:active){a.maplibregl-ctrl-logo{background-color:transparent;background-image:url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='88' height='23' fill='none'%3E %3Cpath fill='%23000' fill-opacity='.4' fill-rule='evenodd' d='M17.408 16.796h-1.827l2.501-12.095h.198l3.324 6.533.988 2.19.988-2.19 3.258-6.533h.181l2.6 12.095h-1.81l-1.218-5.644-.362-1.71-.658 1.71-2.929 5.644h-.098l-2.914-5.644-.757-1.71-.345 1.71zm1.958-3.42-.726 3.663a1.255 1.255 0 0 1-1.232 1.011h-1.827a1.255 1.255 0 0 1-1.229-1.509l2.501-12.095a1.255 1.255 0 0 1 1.23-1.001h.197a1.25 1.25 0 0 1 1.12.685l3.19 6.273 3.125-6.263a1.25 1.25 0 0 1 1.123-.695h.181a1.255 1.255 0 0 1 1.227.991l1.443 6.71a5 5 0 0 1 .314-.787l.009-.016a4.6 4.6 0 0 1 1.777-1.887c.782-.46 1.668-.667 2.611-.667a4.6 4.6 0 0 1 1.7.32l.306.134c.21-.16.474-.256.759-.256h1.694a1.255 1.255 0 0 1 1.212.925 1.255 1.255 0 0 1 1.212-.925h1.711c.284 0 .545.094.755.252.613-.3 1.312-.45 2.075-.45 1.356 0 2.557.445 3.482 1.4q.47.48.763 1.064V4.701a1.255 1.255 0 0 1 1.255-1.255h1.86A1.255 1.255 0 0 1 54.44 4.7v9.194h2.217c.19 0 .37.043.532.118v-4.77c0-.356.147-.678.385-.906a2.42 2.42 0 0 1-.682-1.71c0-.665.267-1.253.735-1.7a2.45 2.45 0 0 1 1.722-.674 2.43 2.43 0 0 1 1.705.675q.318.302.504.683V4.7a1.255 1.255 0 0 1 1.255-1.255h1.744A1.255 1.255 0 0 1 65.812 4.7v3.335a4.8 4.8 0 0 1 1.526-.246c.938 0 1.817.214 2.59.69a4.47 4.47 0 0 1 1.67 1.743v-.98a1.255 1.255 0 0 1 1.256-1.256h1.777c.233 0 .451.064.639.174a3.4 3.4 0 0 1 1.567-.372c.346 0 .861.02 1.285.232a1.25 1.25 0 0 1 .689 1.004 4.7 4.7 0 0 1 .853-.588c.795-.44 1.675-.647 2.61-.647 1.385 0 2.65.39 3.525 1.396.836.938 1.168 2.173 1.168 3.528q-.001.515-.056 1.051a1.255 1.255 0 0 1-.947 1.09l.408.952a1.255 1.255 0 0 1-.477 1.552c-.418.268-.92.463-1.458.612-.613.171-1.304.244-2.049.244-1.06 0-2.043-.207-2.886-.698l-.015-.008c-.798-.48-1.419-1.135-1.818-1.963l-.004-.008a5.8 5.8 0 0 1-.548-2.512q0-.429.053-.843a1.3 1.3 0 0 1-.333-.086l-.166-.004c-.223 0-.426.062-.643.228-.03.024-.142.139-.142.59v3.883a1.255 1.255 0 0 1-1.256 1.256h-1.777a1.255 1.255 0 0 1-1.256-1.256V15.69l-.032.057a4.8 4.8 0 0 1-1.86 1.833 5.04 5.04 0 0 1-2.484.634 4.5 4.5 0 0 1-1.935-.424 1.25 1.25 0 0 1-.764.258h-1.71a1.255 1.255 0 0 1-1.256-1.255V7.687a2.4 2.4 0 0 1-.428.625c.253.23.412.561.412.93v7.553a1.255 1.255 0 0 1-1.256 1.255h-1.843a1.25 1.25 0 0 1-.894-.373c-.228.23-.544.373-.894.373H51.32a1.255 1.255 0 0 1-1.256-1.255v-1.251l-.061.117a4.7 4.7 0 0 1-1.782 1.884 4.77 4.77 0 0 1-2.485.67 5.6 5.6 0 0 1-1.485-.188l.009 2.764a1.255 1.255 0 0 1-1.255 1.259h-1.729a1.255 1.255 0 0 1-1.255-1.255v-3.537a1.255 1.255 0 0 1-1.167.793h-1.679a1.25 1.25 0 0 1-.77-.263 4.5 4.5 0 0 1-1.945.429c-.885 0-1.724-.21-2.495-.632l-.017-.01a5 5 0 0 1-1.081-.836 1.255 1.255 0 0 1-1.254 1.312h-1.81a1.255 1.255 0 0 1-1.228-.99l-.782-3.625-2.044 3.939a1.25 1.25 0 0 1-1.115.676h-.098a1.25 1.25 0 0 1-1.116-.68l-2.061-3.994zM35.92 16.63l.207-.114.223-.15q.493-.356.735-.785l.061-.118.033 1.332h1.678V9.242h-1.694l-.033 1.267q-.133-.329-.526-.658l-.032-.028a3.2 3.2 0 0 0-.668-.428l-.27-.12a3.3 3.3 0 0 0-1.235-.23q-1.136-.001-1.974.493a3.36 3.36 0 0 0-1.3 1.382q-.445.89-.444 2.074 0 1.2.51 2.107a3.8 3.8 0 0 0 1.382 1.381 3.9 3.9 0 0 0 1.893.477q.795 0 1.455-.33zm-2.789-5.38q-.576.675-.575 1.762 0 1.102.559 1.794.576.675 1.645.675a2.25 2.25 0 0 0 .934-.19 2.2 2.2 0 0 0 .468-.29l.178-.161a2.2 2.2 0 0 0 .397-.561q.244-.5.244-1.15v-.115q0-.708-.296-1.267l-.043-.077a2.2 2.2 0 0 0-.633-.709l-.13-.086-.047-.028a2.1 2.1 0 0 0-1.073-.285q-1.052 0-1.629.692zm2.316 2.706c.163-.17.28-.407.28-.83v-.114c0-.292-.06-.508-.15-.68a.96.96 0 0 0-.353-.389.85.85 0 0 0-.464-.127c-.4 0-.56.114-.664.239l-.01.012c-.148.174-.275.45-.275.945 0 .506.122.801.27.99.097.11.266.224.68.224.303 0 .504-.09.687-.269zm7.545 1.705a2.6 2.6 0 0 0 .331.423q.319.33.755.548l.173.074q.65.255 1.49.255 1.02 0 1.844-.493a3.45 3.45 0 0 0 1.316-1.4q.493-.904.493-2.089 0-1.909-.988-2.913-.988-1.02-2.584-1.02-.898 0-1.575.347a3 3 0 0 0-.415.262l-.199.166a3.4 3.4 0 0 0-.64.82V9.242h-1.712v11.553h1.729l-.017-5.134zm.53-1.138q.206.29.48.5l.155.11.053.034q.51.296 1.119.297 1.07 0 1.645-.675.577-.69.576-1.762 0-1.119-.576-1.777-.558-.675-1.645-.675-.435 0-.835.16a2 2 0 0 0-.284.136 2 2 0 0 0-.363.254 2.2 2.2 0 0 0-.46.569l-.082.162a2.6 2.6 0 0 0-.213 1.072v.115q0 .707.296 1.267l.135.211zm.964-.818a1.1 1.1 0 0 0 .367.385.94.94 0 0 0 .476.118c.423 0 .59-.117.687-.23.159-.194.28-.478.28-.95 0-.53-.133-.8-.266-.952l-.021-.025c-.078-.094-.231-.221-.68-.221a1 1 0 0 0-.503.135l-.012.007a.86.86 0 0 0-.335.343c-.073.133-.132.324-.132.614v.115a1.4 1.4 0 0 0 .14.66zm15.7-6.222q.347-.346.346-.856a1.05 1.05 0 0 0-.345-.79 1.18 1.18 0 0 0-.84-.329q-.51 0-.855.33a1.05 1.05 0 0 0-.346.79q0 .51.346.855.345.346.856.346.51 0 .839-.346zm4.337 9.314.033-1.332q.191.403.59.747l.098.081a4 4 0 0 0 .316.224l.223.122a3.2 3.2 0 0 0 1.44.322 3.8 3.8 0 0 0 1.875-.477 3.5 3.5 0 0 0 1.382-1.366q.527-.89.526-2.09 0-1.184-.444-2.073a3.24 3.24 0 0 0-1.283-1.399q-.823-.51-1.942-.51a3.5 3.5 0 0 0-1.527.344l-.086.043-.165.09a3 3 0 0 0-.33.214q-.432.315-.656.707a2 2 0 0 0-.099.198l.082-1.283V4.701h-1.744v12.095zm.473-2.509a2.5 2.5 0 0 0 .566.7q.117.098.245.18l.144.08a2.1 2.1 0 0 0 .975.232q1.07 0 1.645-.675.576-.69.576-1.778 0-1.102-.576-1.777-.56-.691-1.645-.692a2.2 2.2 0 0 0-1.015.235q-.22.113-.415.282l-.15.142a2.1 2.1 0 0 0-.42.594q-.223.479-.223 1.1v.115q0 .705.293 1.26zm2.616-.293c.157-.191.28-.479.28-.967 0-.51-.13-.79-.276-.961l-.021-.026c-.082-.1-.232-.225-.67-.225a.87.87 0 0 0-.681.279l-.012.011c-.154.155-.274.38-.274.807v.115c0 .285.057.499.144.669a1.1 1.1 0 0 0 .367.405c.137.082.28.123.455.123.423 0 .59-.118.686-.23zm8.266-3.013q.345-.13.724-.14l.069-.002q.493 0 .642.099l.247-1.794q-.196-.099-.717-.099a2.3 2.3 0 0 0-.545.063 2 2 0 0 0-.411.148 2.2 2.2 0 0 0-.4.249 2.5 2.5 0 0 0-.485.499 2.7 2.7 0 0 0-.32.581l-.05.137v-1.48h-1.778v7.553h1.777v-3.884q0-.546.159-.943a1.5 1.5 0 0 1 .466-.636 2.5 2.5 0 0 1 .399-.253 2 2 0 0 1 .224-.099zm9.784 2.656.05-.922q0-1.743-.856-2.698-.838-.97-2.584-.97-1.119-.001-2.007.493a3.46 3.46 0 0 0-1.4 1.382q-.493.906-.493 2.106 0 1.07.428 1.975.428.89 1.332 1.432.906.526 2.255.526.973 0 1.668-.185l.044-.012.135-.04q.613-.184.984-.421l-.542-1.267q-.3.162-.642.274l-.297.087q-.51.131-1.3.131-.954 0-1.497-.444a1.6 1.6 0 0 1-.192-.193q-.366-.44-.512-1.234l-.004-.021zm-5.427-1.256-.003.022h3.752v-.138q-.011-.727-.288-1.118a1 1 0 0 0-.156-.176q-.46-.428-1.316-.428-.986 0-1.494.604-.379.45-.494 1.234zm-27.053 2.77V4.7h-1.86v12.095h5.333V15.15zm7.103-5.908v7.553h-1.843V9.242h1.843z'/%3E %3Cpath fill='%23fff' d='m19.63 11.151-.757-1.71-.345 1.71-1.12 5.644h-1.827L18.083 4.7h.197l3.325 6.533.988 2.19.988-2.19L26.839 4.7h.181l2.6 12.095h-1.81l-1.218-5.644-.362-1.71-.658 1.71-2.93 5.644h-.098l-2.913-5.644zm14.836 5.81q-1.02 0-1.893-.478a3.8 3.8 0 0 1-1.381-1.382q-.51-.906-.51-2.106 0-1.185.444-2.074a3.36 3.36 0 0 1 1.3-1.382q.839-.494 1.974-.494a3.3 3.3 0 0 1 1.234.231 3.3 3.3 0 0 1 .97.575q.396.33.527.659l.033-1.267h1.694v7.553H37.18l-.033-1.332q-.279.593-1.02 1.053a3.17 3.17 0 0 1-1.662.444zm.296-1.482q.938 0 1.58-.642.642-.66.642-1.711v-.115q0-.708-.296-1.267a2.2 2.2 0 0 0-.807-.872 2.1 2.1 0 0 0-1.119-.313q-1.053 0-1.629.692-.575.675-.575 1.76 0 1.103.559 1.795.577.675 1.645.675zm6.521-6.237h1.711v1.4q.906-1.597 2.83-1.597 1.596 0 2.584 1.02.988 1.005.988 2.914 0 1.185-.493 2.09a3.46 3.46 0 0 1-1.316 1.399 3.5 3.5 0 0 1-1.844.493q-.954 0-1.662-.329a2.67 2.67 0 0 1-1.086-.97l.017 5.134h-1.728zm4.048 6.22q1.07 0 1.645-.674.577-.69.576-1.762 0-1.119-.576-1.777-.558-.675-1.645-.675-.592 0-1.12.296-.51.28-.822.823-.296.527-.296 1.234v.115q0 .708.296 1.267.313.543.823.855.51.296 1.119.297z'/%3E %3Cpath fill='%23e1e3e9' d='M51.325 4.7h1.86v10.45h3.473v1.646h-5.333zm7.12 4.542h1.843v7.553h-1.843zm.905-1.415a1.16 1.16 0 0 1-.856-.346 1.17 1.17 0 0 1-.346-.856 1.05 1.05 0 0 1 .346-.79q.346-.329.856-.329.494 0 .839.33a1.05 1.05 0 0 1 .345.79 1.16 1.16 0 0 1-.345.855q-.33.346-.84.346zm7.875 9.133a3.17 3.17 0 0 1-1.662-.444q-.723-.46-1.004-1.053l-.033 1.332h-1.71V4.701h1.743v4.657l-.082 1.283q.279-.658 1.086-1.119a3.5 3.5 0 0 1 1.778-.477q1.119 0 1.942.51a3.24 3.24 0 0 1 1.283 1.4q.445.888.444 2.072 0 1.201-.526 2.09a3.5 3.5 0 0 1-1.382 1.366 3.8 3.8 0 0 1-1.876.477zm-.296-1.481q1.069 0 1.645-.675.577-.69.577-1.778 0-1.102-.577-1.776-.56-.691-1.645-.692a2.12 2.12 0 0 0-1.58.659q-.642.641-.642 1.694v.115q0 .71.296 1.267a2.4 2.4 0 0 0 .807.872 2.1 2.1 0 0 0 1.119.313zm5.927-6.237h1.777v1.481q.263-.757.856-1.217a2.14 2.14 0 0 1 1.349-.46q.527 0 .724.098l-.247 1.794q-.149-.099-.642-.099-.774 0-1.416.494-.626.493-.626 1.58v3.883h-1.777V9.242zm9.534 7.718q-1.35 0-2.255-.526-.904-.543-1.332-1.432a4.6 4.6 0 0 1-.428-1.975q0-1.2.493-2.106a3.46 3.46 0 0 1 1.4-1.382q.889-.495 2.007-.494 1.744 0 2.584.97.855.956.856 2.7 0 .444-.05.92h-5.43q.18 1.005.708 1.45.542.443 1.497.443.79 0 1.3-.131a4 4 0 0 0 .938-.362l.542 1.267q-.411.263-1.119.46-.708.198-1.711.197zm1.596-4.558q.016-1.02-.444-1.432-.46-.428-1.316-.428-1.728 0-1.991 1.86z'/%3E %3Cpath d='M5.074 15.948a.484.657 0 0 0-.486.659v1.84a.484.657 0 0 0 .486.659h4.101a.484.657 0 0 0 .486-.659v-1.84a.484.657 0 0 0-.486-.659zm3.56 1.16H5.617v.838h3.017z' style='fill:%23fff;fill-rule:evenodd;stroke-width:1.03600001'/%3E %3Cg style='stroke-width:1.12603545'%3E %3Cpath d='M-9.408-1.416c-3.833-.025-7.056 2.912-7.08 6.615-.02 3.08 1.653 4.832 3.107 6.268.903.892 1.721 1.74 2.32 2.902l-.525-.004c-.543-.003-.992.304-1.24.639a1.87 1.87 0 0 0-.362 1.121l-.011 1.877c-.003.402.104.787.347 1.125.244.338.688.653 1.23.656l4.142.028c.542.003.99-.306 1.238-.641a1.87 1.87 0 0 0 .363-1.121l.012-1.875a1.87 1.87 0 0 0-.348-1.127c-.243-.338-.688-.653-1.23-.656l-.518-.004c.597-1.145 1.425-1.983 2.348-2.87 1.473-1.414 3.18-3.149 3.2-6.226-.016-3.59-2.923-6.684-6.993-6.707m-.006 1.1v.002c3.274.02 5.92 2.532 5.9 5.6-.017 2.706-1.39 4.026-2.863 5.44-1.034.994-2.118 2.033-2.814 3.633-.018.041-.052.055-.075.065q-.013.004-.02.01a.34.34 0 0 1-.226.084.34.34 0 0 1-.224-.086l-.092-.077c-.699-1.615-1.768-2.669-2.781-3.67-1.454-1.435-2.797-2.762-2.78-5.478.02-3.067 2.7-5.545 5.975-5.523m-.02 2.826c-1.62-.01-2.944 1.315-2.955 2.96-.01 1.646 1.295 2.988 2.916 2.999h.002c1.621.01 2.943-1.316 2.953-2.961.011-1.646-1.294-2.988-2.916-2.998m-.005 1.1c1.017.006 1.829.83 1.822 1.89s-.83 1.874-1.848 1.867c-1.018-.006-1.829-.83-1.822-1.89s.83-1.874 1.848-1.868m-2.155 11.857 4.14.025c.271.002.49.305.487.676l-.013 1.875c-.003.37-.224.67-.495.668l-4.14-.025c-.27-.002-.487-.306-.485-.676l.012-1.875c.003-.37.224-.67.494-.668' style='color:%23000;font-style:normal;font-variant:normal;font-weight:400;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:%23000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:evenodd;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:%23000;solid-opacity:1;vector-effect:none;fill:%23000;fill-opacity:.4;fill-rule:evenodd;stroke:none;stroke-width:2.47727823;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto' transform='translate(15.553 2.85)scale(.88807)'/%3E %3Cpath d='M-9.415-.316C-12.69-.338-15.37 2.14-15.39 5.207c-.017 2.716 1.326 4.041 2.78 5.477 1.013 1 2.081 2.055 2.78 3.67l.092.076a.34.34 0 0 0 .225.086.34.34 0 0 0 .227-.083l.019-.01c.022-.009.057-.024.074-.064.697-1.6 1.78-2.64 2.814-3.634 1.473-1.414 2.847-2.733 2.864-5.44.02-3.067-2.627-5.58-5.901-5.601m-.057 8.784c1.621.011 2.944-1.315 2.955-2.96.01-1.646-1.295-2.988-2.916-2.999-1.622-.01-2.945 1.315-2.955 2.96s1.295 2.989 2.916 3' style='clip-rule:evenodd;fill:%23e1e3e9;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.47727823;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:.4' transform='translate(15.553 2.85)scale(.88807)'/%3E %3Cpath d='M-11.594 15.465c-.27-.002-.492.297-.494.668l-.012 1.876c-.003.371.214.673.485.675l4.14.027c.271.002.492-.298.495-.668l.012-1.877c.003-.37-.215-.672-.485-.674z' style='clip-rule:evenodd;fill:%23fff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.47727823;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:.4' transform='translate(15.553 2.85)scale(.88807)'/%3E %3C/g%3E %3C/svg%3E\")}}@media(forced-colors:active) and (prefers-color-scheme:light){a.maplibregl-ctrl-logo{background-image:url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='88' height='23' fill='none'%3E %3Cpath fill='%23000' fill-opacity='.4' fill-rule='evenodd' d='M17.408 16.796h-1.827l2.501-12.095h.198l3.324 6.533.988 2.19.988-2.19 3.258-6.533h.181l2.6 12.095h-1.81l-1.218-5.644-.362-1.71-.658 1.71-2.929 5.644h-.098l-2.914-5.644-.757-1.71-.345 1.71zm1.958-3.42-.726 3.663a1.255 1.255 0 0 1-1.232 1.011h-1.827a1.255 1.255 0 0 1-1.229-1.509l2.501-12.095a1.255 1.255 0 0 1 1.23-1.001h.197a1.25 1.25 0 0 1 1.12.685l3.19 6.273 3.125-6.263a1.25 1.25 0 0 1 1.123-.695h.181a1.255 1.255 0 0 1 1.227.991l1.443 6.71a5 5 0 0 1 .314-.787l.009-.016a4.6 4.6 0 0 1 1.777-1.887c.782-.46 1.668-.667 2.611-.667a4.6 4.6 0 0 1 1.7.32l.306.134c.21-.16.474-.256.759-.256h1.694a1.255 1.255 0 0 1 1.212.925 1.255 1.255 0 0 1 1.212-.925h1.711c.284 0 .545.094.755.252.613-.3 1.312-.45 2.075-.45 1.356 0 2.557.445 3.482 1.4q.47.48.763 1.064V4.701a1.255 1.255 0 0 1 1.255-1.255h1.86A1.255 1.255 0 0 1 54.44 4.7v9.194h2.217c.19 0 .37.043.532.118v-4.77c0-.356.147-.678.385-.906a2.42 2.42 0 0 1-.682-1.71c0-.665.267-1.253.735-1.7a2.45 2.45 0 0 1 1.722-.674 2.43 2.43 0 0 1 1.705.675q.318.302.504.683V4.7a1.255 1.255 0 0 1 1.255-1.255h1.744A1.255 1.255 0 0 1 65.812 4.7v3.335a4.8 4.8 0 0 1 1.526-.246c.938 0 1.817.214 2.59.69a4.47 4.47 0 0 1 1.67 1.743v-.98a1.255 1.255 0 0 1 1.256-1.256h1.777c.233 0 .451.064.639.174a3.4 3.4 0 0 1 1.567-.372c.346 0 .861.02 1.285.232a1.25 1.25 0 0 1 .689 1.004 4.7 4.7 0 0 1 .853-.588c.795-.44 1.675-.647 2.61-.647 1.385 0 2.65.39 3.525 1.396.836.938 1.168 2.173 1.168 3.528q-.001.515-.056 1.051a1.255 1.255 0 0 1-.947 1.09l.408.952a1.255 1.255 0 0 1-.477 1.552c-.418.268-.92.463-1.458.612-.613.171-1.304.244-2.049.244-1.06 0-2.043-.207-2.886-.698l-.015-.008c-.798-.48-1.419-1.135-1.818-1.963l-.004-.008a5.8 5.8 0 0 1-.548-2.512q0-.429.053-.843a1.3 1.3 0 0 1-.333-.086l-.166-.004c-.223 0-.426.062-.643.228-.03.024-.142.139-.142.59v3.883a1.255 1.255 0 0 1-1.256 1.256h-1.777a1.255 1.255 0 0 1-1.256-1.256V15.69l-.032.057a4.8 4.8 0 0 1-1.86 1.833 5.04 5.04 0 0 1-2.484.634 4.5 4.5 0 0 1-1.935-.424 1.25 1.25 0 0 1-.764.258h-1.71a1.255 1.255 0 0 1-1.256-1.255V7.687a2.4 2.4 0 0 1-.428.625c.253.23.412.561.412.93v7.553a1.255 1.255 0 0 1-1.256 1.255h-1.843a1.25 1.25 0 0 1-.894-.373c-.228.23-.544.373-.894.373H51.32a1.255 1.255 0 0 1-1.256-1.255v-1.251l-.061.117a4.7 4.7 0 0 1-1.782 1.884 4.77 4.77 0 0 1-2.485.67 5.6 5.6 0 0 1-1.485-.188l.009 2.764a1.255 1.255 0 0 1-1.255 1.259h-1.729a1.255 1.255 0 0 1-1.255-1.255v-3.537a1.255 1.255 0 0 1-1.167.793h-1.679a1.25 1.25 0 0 1-.77-.263 4.5 4.5 0 0 1-1.945.429c-.885 0-1.724-.21-2.495-.632l-.017-.01a5 5 0 0 1-1.081-.836 1.255 1.255 0 0 1-1.254 1.312h-1.81a1.255 1.255 0 0 1-1.228-.99l-.782-3.625-2.044 3.939a1.25 1.25 0 0 1-1.115.676h-.098a1.25 1.25 0 0 1-1.116-.68l-2.061-3.994zM35.92 16.63l.207-.114.223-.15q.493-.356.735-.785l.061-.118.033 1.332h1.678V9.242h-1.694l-.033 1.267q-.133-.329-.526-.658l-.032-.028a3.2 3.2 0 0 0-.668-.428l-.27-.12a3.3 3.3 0 0 0-1.235-.23q-1.136-.001-1.974.493a3.36 3.36 0 0 0-1.3 1.382q-.445.89-.444 2.074 0 1.2.51 2.107a3.8 3.8 0 0 0 1.382 1.381 3.9 3.9 0 0 0 1.893.477q.795 0 1.455-.33zm-2.789-5.38q-.576.675-.575 1.762 0 1.102.559 1.794.576.675 1.645.675a2.25 2.25 0 0 0 .934-.19 2.2 2.2 0 0 0 .468-.29l.178-.161a2.2 2.2 0 0 0 .397-.561q.244-.5.244-1.15v-.115q0-.708-.296-1.267l-.043-.077a2.2 2.2 0 0 0-.633-.709l-.13-.086-.047-.028a2.1 2.1 0 0 0-1.073-.285q-1.052 0-1.629.692zm2.316 2.706c.163-.17.28-.407.28-.83v-.114c0-.292-.06-.508-.15-.68a.96.96 0 0 0-.353-.389.85.85 0 0 0-.464-.127c-.4 0-.56.114-.664.239l-.01.012c-.148.174-.275.45-.275.945 0 .506.122.801.27.99.097.11.266.224.68.224.303 0 .504-.09.687-.269zm7.545 1.705a2.6 2.6 0 0 0 .331.423q.319.33.755.548l.173.074q.65.255 1.49.255 1.02 0 1.844-.493a3.45 3.45 0 0 0 1.316-1.4q.493-.904.493-2.089 0-1.909-.988-2.913-.988-1.02-2.584-1.02-.898 0-1.575.347a3 3 0 0 0-.415.262l-.199.166a3.4 3.4 0 0 0-.64.82V9.242h-1.712v11.553h1.729l-.017-5.134zm.53-1.138q.206.29.48.5l.155.11.053.034q.51.296 1.119.297 1.07 0 1.645-.675.577-.69.576-1.762 0-1.119-.576-1.777-.558-.675-1.645-.675-.435 0-.835.16a2 2 0 0 0-.284.136 2 2 0 0 0-.363.254 2.2 2.2 0 0 0-.46.569l-.082.162a2.6 2.6 0 0 0-.213 1.072v.115q0 .707.296 1.267l.135.211zm.964-.818a1.1 1.1 0 0 0 .367.385.94.94 0 0 0 .476.118c.423 0 .59-.117.687-.23.159-.194.28-.478.28-.95 0-.53-.133-.8-.266-.952l-.021-.025c-.078-.094-.231-.221-.68-.221a1 1 0 0 0-.503.135l-.012.007a.86.86 0 0 0-.335.343c-.073.133-.132.324-.132.614v.115a1.4 1.4 0 0 0 .14.66zm15.7-6.222q.347-.346.346-.856a1.05 1.05 0 0 0-.345-.79 1.18 1.18 0 0 0-.84-.329q-.51 0-.855.33a1.05 1.05 0 0 0-.346.79q0 .51.346.855.345.346.856.346.51 0 .839-.346zm4.337 9.314.033-1.332q.191.403.59.747l.098.081a4 4 0 0 0 .316.224l.223.122a3.2 3.2 0 0 0 1.44.322 3.8 3.8 0 0 0 1.875-.477 3.5 3.5 0 0 0 1.382-1.366q.527-.89.526-2.09 0-1.184-.444-2.073a3.24 3.24 0 0 0-1.283-1.399q-.823-.51-1.942-.51a3.5 3.5 0 0 0-1.527.344l-.086.043-.165.09a3 3 0 0 0-.33.214q-.432.315-.656.707a2 2 0 0 0-.099.198l.082-1.283V4.701h-1.744v12.095zm.473-2.509a2.5 2.5 0 0 0 .566.7q.117.098.245.18l.144.08a2.1 2.1 0 0 0 .975.232q1.07 0 1.645-.675.576-.69.576-1.778 0-1.102-.576-1.777-.56-.691-1.645-.692a2.2 2.2 0 0 0-1.015.235q-.22.113-.415.282l-.15.142a2.1 2.1 0 0 0-.42.594q-.223.479-.223 1.1v.115q0 .705.293 1.26zm2.616-.293c.157-.191.28-.479.28-.967 0-.51-.13-.79-.276-.961l-.021-.026c-.082-.1-.232-.225-.67-.225a.87.87 0 0 0-.681.279l-.012.011c-.154.155-.274.38-.274.807v.115c0 .285.057.499.144.669a1.1 1.1 0 0 0 .367.405c.137.082.28.123.455.123.423 0 .59-.118.686-.23zm8.266-3.013q.345-.13.724-.14l.069-.002q.493 0 .642.099l.247-1.794q-.196-.099-.717-.099a2.3 2.3 0 0 0-.545.063 2 2 0 0 0-.411.148 2.2 2.2 0 0 0-.4.249 2.5 2.5 0 0 0-.485.499 2.7 2.7 0 0 0-.32.581l-.05.137v-1.48h-1.778v7.553h1.777v-3.884q0-.546.159-.943a1.5 1.5 0 0 1 .466-.636 2.5 2.5 0 0 1 .399-.253 2 2 0 0 1 .224-.099zm9.784 2.656.05-.922q0-1.743-.856-2.698-.838-.97-2.584-.97-1.119-.001-2.007.493a3.46 3.46 0 0 0-1.4 1.382q-.493.906-.493 2.106 0 1.07.428 1.975.428.89 1.332 1.432.906.526 2.255.526.973 0 1.668-.185l.044-.012.135-.04q.613-.184.984-.421l-.542-1.267q-.3.162-.642.274l-.297.087q-.51.131-1.3.131-.954 0-1.497-.444a1.6 1.6 0 0 1-.192-.193q-.366-.44-.512-1.234l-.004-.021zm-5.427-1.256-.003.022h3.752v-.138q-.011-.727-.288-1.118a1 1 0 0 0-.156-.176q-.46-.428-1.316-.428-.986 0-1.494.604-.379.45-.494 1.234zm-27.053 2.77V4.7h-1.86v12.095h5.333V15.15zm7.103-5.908v7.553h-1.843V9.242h1.843z'/%3E %3Cpath fill='%23fff' d='m19.63 11.151-.757-1.71-.345 1.71-1.12 5.644h-1.827L18.083 4.7h.197l3.325 6.533.988 2.19.988-2.19L26.839 4.7h.181l2.6 12.095h-1.81l-1.218-5.644-.362-1.71-.658 1.71-2.93 5.644h-.098l-2.913-5.644zm14.836 5.81q-1.02 0-1.893-.478a3.8 3.8 0 0 1-1.381-1.382q-.51-.906-.51-2.106 0-1.185.444-2.074a3.36 3.36 0 0 1 1.3-1.382q.839-.494 1.974-.494a3.3 3.3 0 0 1 1.234.231 3.3 3.3 0 0 1 .97.575q.396.33.527.659l.033-1.267h1.694v7.553H37.18l-.033-1.332q-.279.593-1.02 1.053a3.17 3.17 0 0 1-1.662.444zm.296-1.482q.938 0 1.58-.642.642-.66.642-1.711v-.115q0-.708-.296-1.267a2.2 2.2 0 0 0-.807-.872 2.1 2.1 0 0 0-1.119-.313q-1.053 0-1.629.692-.575.675-.575 1.76 0 1.103.559 1.795.577.675 1.645.675zm6.521-6.237h1.711v1.4q.906-1.597 2.83-1.597 1.596 0 2.584 1.02.988 1.005.988 2.914 0 1.185-.493 2.09a3.46 3.46 0 0 1-1.316 1.399 3.5 3.5 0 0 1-1.844.493q-.954 0-1.662-.329a2.67 2.67 0 0 1-1.086-.97l.017 5.134h-1.728zm4.048 6.22q1.07 0 1.645-.674.577-.69.576-1.762 0-1.119-.576-1.777-.558-.675-1.645-.675-.592 0-1.12.296-.51.28-.822.823-.296.527-.296 1.234v.115q0 .708.296 1.267.313.543.823.855.51.296 1.119.297z'/%3E %3Cpath fill='%23e1e3e9' d='M51.325 4.7h1.86v10.45h3.473v1.646h-5.333zm7.12 4.542h1.843v7.553h-1.843zm.905-1.415a1.16 1.16 0 0 1-.856-.346 1.17 1.17 0 0 1-.346-.856 1.05 1.05 0 0 1 .346-.79q.346-.329.856-.329.494 0 .839.33a1.05 1.05 0 0 1 .345.79 1.16 1.16 0 0 1-.345.855q-.33.346-.84.346zm7.875 9.133a3.17 3.17 0 0 1-1.662-.444q-.723-.46-1.004-1.053l-.033 1.332h-1.71V4.701h1.743v4.657l-.082 1.283q.279-.658 1.086-1.119a3.5 3.5 0 0 1 1.778-.477q1.119 0 1.942.51a3.24 3.24 0 0 1 1.283 1.4q.445.888.444 2.072 0 1.201-.526 2.09a3.5 3.5 0 0 1-1.382 1.366 3.8 3.8 0 0 1-1.876.477zm-.296-1.481q1.069 0 1.645-.675.577-.69.577-1.778 0-1.102-.577-1.776-.56-.691-1.645-.692a2.12 2.12 0 0 0-1.58.659q-.642.641-.642 1.694v.115q0 .71.296 1.267a2.4 2.4 0 0 0 .807.872 2.1 2.1 0 0 0 1.119.313zm5.927-6.237h1.777v1.481q.263-.757.856-1.217a2.14 2.14 0 0 1 1.349-.46q.527 0 .724.098l-.247 1.794q-.149-.099-.642-.099-.774 0-1.416.494-.626.493-.626 1.58v3.883h-1.777V9.242zm9.534 7.718q-1.35 0-2.255-.526-.904-.543-1.332-1.432a4.6 4.6 0 0 1-.428-1.975q0-1.2.493-2.106a3.46 3.46 0 0 1 1.4-1.382q.889-.495 2.007-.494 1.744 0 2.584.97.855.956.856 2.7 0 .444-.05.92h-5.43q.18 1.005.708 1.45.542.443 1.497.443.79 0 1.3-.131a4 4 0 0 0 .938-.362l.542 1.267q-.411.263-1.119.46-.708.198-1.711.197zm1.596-4.558q.016-1.02-.444-1.432-.46-.428-1.316-.428-1.728 0-1.991 1.86z'/%3E %3Cpath d='M5.074 15.948a.484.657 0 0 0-.486.659v1.84a.484.657 0 0 0 .486.659h4.101a.484.657 0 0 0 .486-.659v-1.84a.484.657 0 0 0-.486-.659zm3.56 1.16H5.617v.838h3.017z' style='fill:%23fff;fill-rule:evenodd;stroke-width:1.03600001'/%3E %3Cg style='stroke-width:1.12603545'%3E %3Cpath d='M-9.408-1.416c-3.833-.025-7.056 2.912-7.08 6.615-.02 3.08 1.653 4.832 3.107 6.268.903.892 1.721 1.74 2.32 2.902l-.525-.004c-.543-.003-.992.304-1.24.639a1.87 1.87 0 0 0-.362 1.121l-.011 1.877c-.003.402.104.787.347 1.125.244.338.688.653 1.23.656l4.142.028c.542.003.99-.306 1.238-.641a1.87 1.87 0 0 0 .363-1.121l.012-1.875a1.87 1.87 0 0 0-.348-1.127c-.243-.338-.688-.653-1.23-.656l-.518-.004c.597-1.145 1.425-1.983 2.348-2.87 1.473-1.414 3.18-3.149 3.2-6.226-.016-3.59-2.923-6.684-6.993-6.707m-.006 1.1v.002c3.274.02 5.92 2.532 5.9 5.6-.017 2.706-1.39 4.026-2.863 5.44-1.034.994-2.118 2.033-2.814 3.633-.018.041-.052.055-.075.065q-.013.004-.02.01a.34.34 0 0 1-.226.084.34.34 0 0 1-.224-.086l-.092-.077c-.699-1.615-1.768-2.669-2.781-3.67-1.454-1.435-2.797-2.762-2.78-5.478.02-3.067 2.7-5.545 5.975-5.523m-.02 2.826c-1.62-.01-2.944 1.315-2.955 2.96-.01 1.646 1.295 2.988 2.916 2.999h.002c1.621.01 2.943-1.316 2.953-2.961.011-1.646-1.294-2.988-2.916-2.998m-.005 1.1c1.017.006 1.829.83 1.822 1.89s-.83 1.874-1.848 1.867c-1.018-.006-1.829-.83-1.822-1.89s.83-1.874 1.848-1.868m-2.155 11.857 4.14.025c.271.002.49.305.487.676l-.013 1.875c-.003.37-.224.67-.495.668l-4.14-.025c-.27-.002-.487-.306-.485-.676l.012-1.875c.003-.37.224-.67.494-.668' style='color:%23000;font-style:normal;font-variant:normal;font-weight:400;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:%23000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:evenodd;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:%23000;solid-opacity:1;vector-effect:none;fill:%23000;fill-opacity:.4;fill-rule:evenodd;stroke:none;stroke-width:2.47727823;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto' transform='translate(15.553 2.85)scale(.88807)'/%3E %3Cpath d='M-9.415-.316C-12.69-.338-15.37 2.14-15.39 5.207c-.017 2.716 1.326 4.041 2.78 5.477 1.013 1 2.081 2.055 2.78 3.67l.092.076a.34.34 0 0 0 .225.086.34.34 0 0 0 .227-.083l.019-.01c.022-.009.057-.024.074-.064.697-1.6 1.78-2.64 2.814-3.634 1.473-1.414 2.847-2.733 2.864-5.44.02-3.067-2.627-5.58-5.901-5.601m-.057 8.784c1.621.011 2.944-1.315 2.955-2.96.01-1.646-1.295-2.988-2.916-2.999-1.622-.01-2.945 1.315-2.955 2.96s1.295 2.989 2.916 3' style='clip-rule:evenodd;fill:%23e1e3e9;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.47727823;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:.4' transform='translate(15.553 2.85)scale(.88807)'/%3E %3Cpath d='M-11.594 15.465c-.27-.002-.492.297-.494.668l-.012 1.876c-.003.371.214.673.485.675l4.14.027c.271.002.492-.298.495-.668l.012-1.877c.003-.37-.215-.672-.485-.674z' style='clip-rule:evenodd;fill:%23fff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.47727823;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:.4' transform='translate(15.553 2.85)scale(.88807)'/%3E %3C/g%3E %3C/svg%3E\")}}.maplibregl-ctrl.maplibregl-ctrl-attrib{padding:0 5px;background-color:hsla(0,0%,100%,.5);margin:0}@media screen{.maplibregl-ctrl-attrib.maplibregl-compact{min-height:20px;padding:2px 24px 2px 0;margin:10px;position:relative;background-color:#fff;color:#000;border-radius:12px;box-sizing:content-box}.maplibregl-ctrl-attrib.maplibregl-compact-show{padding:2px 28px 2px 8px;visibility:visible}.maplibregl-ctrl-bottom-left>.maplibregl-ctrl-attrib.maplibregl-compact-show,.maplibregl-ctrl-top-left>.maplibregl-ctrl-attrib.maplibregl-compact-show{padding:2px 8px 2px 28px;border-radius:12px}.maplibregl-ctrl-attrib.maplibregl-compact .maplibregl-ctrl-attrib-inner{display:none}.maplibregl-ctrl-attrib-button{display:none;cursor:pointer;position:absolute;background-image:url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' fill-rule='evenodd' viewBox='0 0 20 20'%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\");background-color:hsla(0,0%,100%,.5);width:24px;height:24px;box-sizing:border-box;border-radius:12px;outline:none;top:0;right:0;border:0}.maplibregl-ctrl-attrib summary.maplibregl-ctrl-attrib-button{-webkit-appearance:none;-moz-appearance:none;appearance:none;list-style:none}.maplibregl-ctrl-attrib summary.maplibregl-ctrl-attrib-button::-webkit-details-marker{display:none}.maplibregl-ctrl-bottom-left .maplibregl-ctrl-attrib-button,.maplibregl-ctrl-top-left .maplibregl-ctrl-attrib-button{left:0}.maplibregl-ctrl-attrib.maplibregl-compact .maplibregl-ctrl-attrib-button,.maplibregl-ctrl-attrib.maplibregl-compact-show .maplibregl-ctrl-attrib-inner{display:block}.maplibregl-ctrl-attrib.maplibregl-compact-show .maplibregl-ctrl-attrib-button{background-color:rgba(0,0,0,.05)}.maplibregl-ctrl-bottom-right>.maplibregl-ctrl-attrib.maplibregl-compact:after{bottom:0;right:0}.maplibregl-ctrl-top-right>.maplibregl-ctrl-attrib.maplibregl-compact:after{top:0;right:0}.maplibregl-ctrl-top-left>.maplibregl-ctrl-attrib.maplibregl-compact:after{top:0;left:0}.maplibregl-ctrl-bottom-left>.maplibregl-ctrl-attrib.maplibregl-compact:after{bottom:0;left:0}}@media screen and (forced-colors:active){.maplibregl-ctrl-attrib.maplibregl-compact:after{background-image:url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' fill-rule='evenodd' viewBox='0 0 20 20' 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\")}}@media screen and (forced-colors:active) and (prefers-color-scheme:light){.maplibregl-ctrl-attrib.maplibregl-compact:after{background-image:url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' fill-rule='evenodd' viewBox='0 0 20 20'%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\")}}.maplibregl-ctrl-attrib a{color:rgba(0,0,0,.75);text-decoration:none}.maplibregl-ctrl-attrib a:hover{color:inherit;text-decoration:underline}.maplibregl-attrib-empty{display:none}.maplibregl-ctrl-scale{background-color:hsla(0,0%,100%,.75);font-size:10px;white-space:nowrap;border-color:#333;border-style:none solid solid;border-width:medium 2px 2px;padding:0 5px;color:#333;box-sizing:border-box}.maplibregl-popup{position:absolute;top:0;left:0;display:flex;will-change:transform;pointer-events:none}.maplibregl-popup-anchor-top,.maplibregl-popup-anchor-top-left,.maplibregl-popup-anchor-top-right{flex-direction:column}.maplibregl-popup-anchor-bottom,.maplibregl-popup-anchor-bottom-left,.maplibregl-popup-anchor-bottom-right{flex-direction:column-reverse}.maplibregl-popup-anchor-left{flex-direction:row}.maplibregl-popup-anchor-right,[dir=rtl] .maplibregl-popup-anchor-left{flex-direction:row-reverse}.maplibregl-popup-tip{width:0;height:0;border:10px solid transparent;z-index:1}.maplibregl-popup-anchor-top .maplibregl-popup-tip{align-self:center;border-top:none;border-bottom-color:#fff}.maplibregl-popup-anchor-top-left .maplibregl-popup-tip{align-self:flex-start;border-top:none;border-left:none;border-bottom-color:#fff}.maplibregl-popup-anchor-top-right .maplibregl-popup-tip{align-self:flex-end;border-top:none;border-right:none;border-bottom-color:#fff}.maplibregl-popup-anchor-bottom .maplibregl-popup-tip{align-self:center;border-bottom:none;border-top-color:#fff}.maplibregl-popup-anchor-bottom-left .maplibregl-popup-tip{align-self:flex-start;border-bottom:none;border-left:none;border-top-color:#fff}.maplibregl-popup-anchor-bottom-right .maplibregl-popup-tip{align-self:flex-end;border-bottom:none;border-right:none;border-top-color:#fff}.maplibregl-popup-anchor-left .maplibregl-popup-tip{align-self:center;border-left:none;border-right-color:#fff}.maplibregl-popup-anchor-right .maplibregl-popup-tip{align-self:center;border-right:none;border-left-color:#fff}[dir=rtl] .maplibregl-popup-anchor-right{flex-direction:row}[dir=rtl] .maplibregl-popup-anchor-top-left .maplibregl-popup-tip{align-self:flex-end}[dir=rtl] .maplibregl-popup-anchor-top-right .maplibregl-popup-tip{align-self:flex-start}[dir=rtl] .maplibregl-popup-anchor-bottom-left .maplibregl-popup-tip{align-self:flex-end}[dir=rtl] .maplibregl-popup-anchor-bottom-right .maplibregl-popup-tip{align-self:flex-start}.maplibregl-popup-close-button{position:absolute;right:0;top:0;border:0;border-radius:0 3px 0 0;cursor:pointer;background-color:transparent}.maplibregl-popup-close-button:hover{background-color:rgba(0,0,0,.05)}.maplibregl-popup-content{position:relative;background:#fff;border-radius:3px;box-shadow:0 1px 2px rgba(0,0,0,.1);padding:15px 10px;pointer-events:auto}.maplibregl-popup-anchor-top-left .maplibregl-popup-content{border-top-left-radius:0}.maplibregl-popup-anchor-top-right .maplibregl-popup-content{border-top-right-radius:0}.maplibregl-popup-anchor-bottom-left .maplibregl-popup-content{border-bottom-left-radius:0}.maplibregl-popup-anchor-bottom-right .maplibregl-popup-content{border-bottom-right-radius:0}.maplibregl-popup-track-pointer{display:none}.maplibregl-popup-track-pointer *{pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}.maplibregl-map:hover .maplibregl-popup-track-pointer{display:flex}.maplibregl-map:active .maplibregl-popup-track-pointer{display:none}.maplibregl-marker{position:absolute;top:0;left:0;will-change:transform;transition:opacity .2s}.maplibregl-marker-draggable{cursor:grab}.maplibregl-user-location-dot,.maplibregl-user-location-dot:before{background-color:#1da1f2;width:15px;height:15px;border-radius:50%}.maplibregl-user-location-dot:before{content:\"\";position:absolute;animation:maplibregl-user-location-dot-pulse 2s infinite}.maplibregl-user-location-dot:after{border-radius:50%;border:2px solid #fff;content:\"\";height:19px;left:-2px;position:absolute;top:-2px;width:19px;box-sizing:border-box;box-shadow:0 0 3px rgba(0,0,0,.35)}@media(prefers-reduced-motion:reduce){.maplibregl-user-location-dot:before{animation:none}}@keyframes maplibregl-user-location-dot-pulse{0%{transform:scale(1);opacity:1}70%{transform:scale(3);opacity:0}to{transform:scale(1);opacity:0}}.maplibregl-user-location-dot-stale{background-color:#aaa}.maplibregl-user-location-dot-stale:after{display:none}.maplibregl-user-location-accuracy-circle{background-color:#1da1f233;width:1px;height:1px;border-radius:100%}.maplibregl-crosshair,.maplibregl-crosshair .maplibregl-interactive,.maplibregl-crosshair .maplibregl-interactive:active{cursor:crosshair}.maplibregl-boxzoom{position:absolute;top:0;left:0;width:0;height:0;background:#fff;border:2px dotted #202020;opacity:.5}.maplibregl-cooperative-gesture-screen{background:rgba(0,0,0,.4);position:absolute;inset:0;display:flex;justify-content:center;align-items:center;color:#fff;padding:1rem;font-size:1.4em;line-height:1.2;opacity:0;pointer-events:none;transition:opacity 1s 1s;z-index:99999}.maplibregl-cooperative-gesture-screen.maplibregl-show{opacity:1;transition:opacity .05s}.maplibregl-cooperative-gesture-screen .maplibregl-mobile-message{display:none}@media(hover:none),(pointer:coarse){.maplibregl-cooperative-gesture-screen .maplibregl-desktop-message{display:none}.maplibregl-cooperative-gesture-screen .maplibregl-mobile-message{display:block}}.maplibregl-pseudo-fullscreen{position:fixed!important;width:100%!important;height:100%!important;top:0!important;left:0!important;z-index:99999}","import type { MapBounds, MapItem, MapPosition } from './types.js';\n\n/** The mean radius of the Earth in meters, as WGS84 distances on the map are measured. */\nconst EARTH_RADIUS = 6_371_008.8;\n\n/** Whether a latitude and longitude are numbers on the globe. */\nexport function isValidPosition(position: MapPosition | null | undefined): position is MapPosition {\n return (\n !!position &&\n Number.isFinite(position.latitude) &&\n Number.isFinite(position.longitude) &&\n Math.abs(position.latitude) <= 90 &&\n Math.abs(position.longitude) <= 180\n );\n}\n\n/** A longitude brought into -180 to 180, as a map that wraps around the world reports past them. */\nexport function wrapLongitude(longitude: number): number {\n const wrapped = ((((longitude + 180) % 360) + 360) % 360) - 180;\n return wrapped === -180 && longitude > 0 ? 180 : wrapped;\n}\n\n/**\n * The position `distance` meters from `origin` on `bearing` degrees from north: a point on a\n * great circle, so a circle drawn from these is round on the ground at any latitude.\n */\nexport function destination(origin: MapPosition, distance: number, bearing: number): MapPosition {\n const angular = distance / EARTH_RADIUS;\n const theta = (bearing * Math.PI) / 180;\n const phi1 = (origin.latitude * Math.PI) / 180;\n const lambda1 = (origin.longitude * Math.PI) / 180;\n\n const sinPhi2 = Math.sin(phi1) * Math.cos(angular) + Math.cos(phi1) * Math.sin(angular) * Math.cos(theta);\n const phi2 = Math.asin(Math.max(-1, Math.min(1, sinPhi2)));\n const lambda2 =\n lambda1 +\n Math.atan2(Math.sin(theta) * Math.sin(angular) * Math.cos(phi1), Math.cos(angular) - Math.sin(phi1) * sinPhi2);\n\n return { latitude: (phi2 * 180) / Math.PI, longitude: wrapLongitude((lambda2 * 180) / Math.PI) };\n}\n\n/** A circle on the ground as a closed ring of `steps` points, for a provider that draws no circles. */\nexport function circlePath(center: MapPosition, radius: number, steps = 64): MapPosition[] {\n const path: MapPosition[] = [];\n for (let step = 0; step < steps; step++) {\n path.push(destination(center, radius, (step * 360) / steps));\n }\n path.push(path[0]!);\n return path;\n}\n\n/** The positions an item covers: a marker's own, a line's or area's path, a circle's extremes. */\nexport function itemPositions(item: MapItem): MapPosition[] {\n switch (item.kind) {\n case 'marker':\n return [item.position];\n case 'polyline':\n case 'polygon':\n return [...item.path];\n case 'circle':\n return [0, 90, 180, 270].map((bearing) => destination(item.center, item.radius, bearing));\n }\n}\n\n/** The smallest bounds holding every position, or null for none. Never across the antimeridian. */\nexport function boundsOf(positions: Iterable<MapPosition>): MapBounds | null {\n let bounds: MapBounds | null = null;\n for (const position of positions) {\n if (!isValidPosition(position)) continue;\n if (!bounds) {\n bounds = { north: position.latitude, south: position.latitude, east: position.longitude, west: position.longitude };\n continue;\n }\n bounds.north = Math.max(bounds.north, position.latitude);\n bounds.south = Math.min(bounds.south, position.latitude);\n bounds.east = Math.max(bounds.east, position.longitude);\n bounds.west = Math.min(bounds.west, position.longitude);\n }\n return bounds;\n}\n\n/** The bounds of every item's positions, or null when none has any. */\nexport function boundsOfItems(items: Iterable<MapItem>): MapBounds | null {\n return boundsOf(\n (function* () {\n for (const item of items) yield* itemPositions(item);\n })(),\n );\n}\n\n/**\n * Bounds as `[west, south, east, north]`, the box a cluster index is asked for: longitudes in\n * -180 to 180, the whole width when the view spans the world.\n */\nexport function toBoundingBox(bounds: MapBounds): [number, number, number, number] {\n const south = Math.max(-90, bounds.south);\n const north = Math.min(90, bounds.north);\n if (bounds.east - bounds.west >= 360) return [-180, south, 180, north];\n return [wrapLongitude(bounds.west), south, wrapLongitude(bounds.east), north];\n}\n\n/** Whether `bounds` contains `position`, across the antimeridian when `west` is east of `east`. */\nexport function boundsContain(bounds: MapBounds, position: MapPosition): boolean {\n if (position.latitude < bounds.south || position.latitude > bounds.north) return false;\n const [west, , east] = toBoundingBox(bounds);\n const longitude = wrapLongitude(position.longitude);\n return west <= east ? longitude >= west && longitude <= east : longitude >= west || longitude <= east;\n}\n\n/** Bounds grown by a share of their size on every side: what is about to scroll into view. */\nexport function padBounds(bounds: MapBounds, ratio: number): MapBounds {\n const height = bounds.north - bounds.south;\n const width = bounds.east - bounds.west;\n return {\n north: Math.min(90, bounds.north + height * ratio),\n south: Math.max(-90, bounds.south - height * ratio),\n east: bounds.east + width * ratio,\n west: bounds.west - width * ratio,\n };\n}\n\n/**\n * The bounds a view of `width` by `height` CSS pixels shows around `center` at `zoom` (on\n * 256-pixel tiles), in Web Mercator: for a provider that can't report its bounds yet.\n */\nexport function approximateBounds(center: MapPosition, zoom: number, width: number, height: number): MapBounds {\n const size = 256 * 2 ** zoom;\n const x = ((center.longitude + 180) / 360) * size;\n const sin = Math.sin((Math.max(-85.0511, Math.min(85.0511, center.latitude)) * Math.PI) / 180);\n const y = (0.5 - Math.log((1 + sin) / (1 - sin)) / (4 * Math.PI)) * size;\n\n const latitudeAt = (pixelY: number) => {\n const n = Math.PI - (2 * Math.PI * Math.max(0, Math.min(size, pixelY))) / size;\n return (Math.atan(Math.sinh(n)) * 180) / Math.PI;\n };\n const longitudeAt = (pixelX: number) => (pixelX / size) * 360 - 180;\n\n return {\n north: latitudeAt(y - height / 2),\n south: latitudeAt(y + height / 2),\n east: longitudeAt(x + width / 2),\n west: longitudeAt(x - width / 2),\n };\n}\n","import type { MapAddressQuery, MapGeocoder } from './provider.js';\nimport type { MapAddressSuggestion, MapBounds, MapPlace } from './types.js';\n\n/** How many places a search suggests. */\nexport const SUGGESTION_COUNT = 5;\n\nexport const AZURE_MAPS_GEOCODE_API_VERSION = '2025-01-01';\nexport const ESRI_GEOCODE_ENDPOINT = 'https://geocode-api.arcgis.com/arcgis/rest/services/World/GeocodeServer';\nexport const NOMINATIM_URL = 'https://nominatim.openstreetmap.org';\n\ntype Fetch = typeof fetch;\n\n/**\n * A place's label as two lines: its first part — the street address, the place's name — and the\n * rest, where it is.\n */\nexport function splitLabel(label: string): Pick<MapAddressSuggestion, 'text' | 'detail'> {\n const comma = label.indexOf(', ');\n return comma < 0 ? { text: label } : { text: label.slice(0, comma), detail: label.slice(comma + 2) };\n}\n\n/**\n * The places a geocoder suggested, by suggestion id, for the one chosen: those of its latest\n * searches, as a list chosen from may be one search behind the one being typed.\n */\nclass FoundPlaces {\n private next = 0;\n private readonly places = new Map<string, MapPlace>();\n\n add(place: MapPlace): MapAddressSuggestion {\n if (this.places.size > 50) this.places.clear();\n const id = `${++this.next}`;\n this.places.set(id, place);\n return { id, ...splitLabel(place.label) };\n }\n\n get(suggestion: MapAddressSuggestion): MapPlace | null {\n return this.places.get(suggestion.id) ?? null;\n }\n}\n\nasync function readJson<T>(response: Response, provider: string): Promise<T> {\n if (!response.ok) throw new Error(`${provider}'s search answered ${response.status} ${response.statusText}.`.trim());\n return (await response.json()) as T;\n}\n\nconst toBounds = (west: number, south: number, east: number, north: number): MapBounds | undefined =>\n [west, south, east, north].every(Number.isFinite) && (west !== east || south !== north) ? { north, south, east, west } : undefined;\n\nconst inCountries = (countries: readonly string[], code: string | undefined) =>\n countries.length === 0 || (!!code && countries.some((country) => country.toLowerCase() === code.toLowerCase()));\n\n// ---- Azure Maps ----\n\ninterface AzureGeocodeResponse {\n features?: {\n bbox?: number[];\n geometry?: { coordinates?: number[] };\n properties?: { address?: { formattedAddress?: string; countryRegion?: { ISO?: string } } };\n }[];\n}\n\n/**\n * Azure Maps' Geocoding API, signed in with the portal's token as its tiles are. It takes no country\n * with free text, so the places it finds are kept to the countries asked for here.\n */\nexport function azureMapsGeocoder(\n endpoint: string,\n headers: () => Record<string, string> | null,\n view: string | undefined,\n fetcher: Fetch = fetch,\n): MapGeocoder {\n const found = new FoundPlaces();\n return {\n suggestsAsYouType: true,\n async suggest({ text, view: mapView, countries, language, signal }: MapAddressQuery) {\n const signIn = headers();\n if (!signIn) throw new Error('Azure Maps has no token to search with yet.');\n const query = new URLSearchParams({\n 'api-version': AZURE_MAPS_GEOCODE_API_VERSION,\n query: text,\n top: `${countries.length ? 20 : SUGGESTION_COUNT}`,\n coordinates: `${mapView.center.longitude},${mapView.center.latitude}`,\n view: view || 'Auto',\n });\n const response = await fetcher(`${endpoint}/geocode?${query}`, {\n headers: { ...signIn, 'Accept-Language': language },\n ...(signal ? { signal } : {}),\n });\n const answer = await readJson<AzureGeocodeResponse>(response, 'Azure Maps');\n const suggestions: MapAddressSuggestion[] = [];\n for (const feature of answer.features ?? []) {\n const [longitude, latitude] = feature.geometry?.coordinates ?? [];\n const label = feature.properties?.address?.formattedAddress;\n if (longitude === undefined || latitude === undefined || !label) continue;\n if (!inCountries(countries, feature.properties?.address?.countryRegion?.ISO)) continue;\n const [west, south, east, north] = feature.bbox ?? [];\n const bounds = feature.bbox?.length === 4 ? toBounds(west!, south!, east!, north!) : undefined;\n suggestions.push(found.add({ label, position: { latitude, longitude }, ...(bounds ? { bounds } : {}) }));\n }\n return suggestions.slice(0, SUGGESTION_COUNT);\n },\n resolve: async (suggestion) => found.get(suggestion),\n };\n}\n\n// ---- Esri ----\n\ninterface EsriError {\n error?: { code?: number; message?: string };\n}\n\ninterface EsriSuggestResponse extends EsriError {\n suggestions?: { text?: string; magicKey?: string }[];\n}\n\ninterface EsriCandidatesResponse extends EsriError {\n candidates?: {\n address?: string;\n location?: { x?: number; y?: number };\n extent?: { xmin?: number; ymin?: number; xmax?: number; ymax?: number };\n }[];\n}\n\n// ArcGIS answers a refused key or a bad request with an error in a 200.\nfunction esriAnswer<T extends EsriError>(answer: T): T {\n if (answer.error) throw new Error(`Esri's search refused the request: ${answer.error.message ?? answer.error.code}.`);\n return answer;\n}\n\n/** The ArcGIS geocoding service, with the portal's key, which needs its geocoding privilege. */\nexport function esriGeocoder(apiKey: string, endpoint: string = ESRI_GEOCODE_ENDPOINT, fetcher: Fetch = fetch): MapGeocoder {\n const magicKeys = new Map<string, string>();\n let next = 0;\n return {\n suggestsAsYouType: true,\n async suggest({ text, view, countries, language, signal }: MapAddressQuery) {\n const query = new URLSearchParams({\n f: 'json',\n text,\n location: `${view.center.longitude},${view.center.latitude}`,\n maxSuggestions: `${SUGGESTION_COUNT}`,\n langCode: language,\n token: apiKey,\n ...(countries.length ? { countryCode: countries.join(',') } : {}),\n });\n const response = await fetcher(`${endpoint}/suggest?${query}`, signal ? { signal } : {});\n const answer = esriAnswer(await readJson<EsriSuggestResponse>(response, 'Esri'));\n if (magicKeys.size > 50) magicKeys.clear();\n return (answer.suggestions ?? []).flatMap((suggestion) => {\n if (!suggestion.text || !suggestion.magicKey) return [];\n const id = `${++next}`;\n magicKeys.set(id, suggestion.magicKey);\n return [{ id, ...splitLabel(suggestion.text) }];\n });\n },\n async resolve(suggestion, signal) {\n const magicKey = magicKeys.get(suggestion.id);\n if (!magicKey) return null;\n const label = suggestion.detail ? `${suggestion.text}, ${suggestion.detail}` : suggestion.text;\n const query = new URLSearchParams({ f: 'json', SingleLine: label, magicKey, maxLocations: '1', token: apiKey });\n const response = await fetcher(`${endpoint}/findAddressCandidates?${query}`, signal ? { signal } : {});\n const candidate = esriAnswer(await readJson<EsriCandidatesResponse>(response, 'Esri')).candidates?.[0];\n const { x: longitude, y: latitude } = candidate?.location ?? {};\n if (longitude === undefined || latitude === undefined) return null;\n const extent = candidate?.extent;\n const bounds = extent ? toBounds(extent.xmin!, extent.ymin!, extent.xmax!, extent.ymax!) : undefined;\n return { label: candidate?.address || label, position: { latitude, longitude }, ...(bounds ? { bounds } : {}) };\n },\n };\n}\n\n// ---- Nominatim ----\n\ninterface NominatimPlace {\n display_name?: string;\n lat?: string;\n lon?: string;\n /** South, north, west, east. */\n boundingbox?: string[];\n}\n\n/**\n * A Nominatim server: OpenStreetMap's own unless the portal names another. OpenStreetMap's usage\n * policy rules out searching as the viewer types, so this one searches when they press Enter.\n */\nexport function nominatimGeocoder(url: string = NOMINATIM_URL, fetcher: Fetch = fetch): MapGeocoder {\n const found = new FoundPlaces();\n return {\n suggestsAsYouType: false,\n async suggest({ text, view, countries, language, signal }: MapAddressQuery) {\n const { north, south, east, west } = view.bounds;\n const query = new URLSearchParams({\n q: text,\n format: 'jsonv2',\n limit: `${SUGGESTION_COUNT}`,\n 'accept-language': language,\n viewbox: `${west},${north},${east},${south}`,\n ...(countries.length ? { countrycodes: countries.join(',').toLowerCase() } : {}),\n });\n const response = await fetcher(`${url.replace(/\\/+$/, '')}/search?${query}`, signal ? { signal } : {});\n const places = await readJson<NominatimPlace[]>(response, 'Nominatim');\n return places.flatMap((place) => {\n const latitude = Number(place.lat);\n const longitude = Number(place.lon);\n if (!place.display_name || !Number.isFinite(latitude) || !Number.isFinite(longitude)) return [];\n const [boxSouth, boxNorth, boxWest, boxEast] = (place.boundingbox ?? []).map(Number);\n const bounds = place.boundingbox?.length === 4 ? toBounds(boxWest!, boxSouth!, boxEast!, boxNorth!) : undefined;\n return [found.add({ label: place.display_name, position: { latitude, longitude }, ...(bounds ? { bounds } : {}) })];\n });\n },\n resolve: async (suggestion) => found.get(suggestion),\n };\n}\n","// Kept apart from the MapLibre provider so setting it doesn't load MapLibre.\nlet workerUrl: string | (() => string | Promise<string>) | null = null;\n\n/**\n * Where MapLibre's worker script is served from. MapLibre 6 loads it as a file of its own, and a\n * bundled app has to say where its bundler put it — once, before a map is drawn:\n *\n * ```ts\n * // Vite\n * import workerUrl from 'maplibre-gl/dist/maplibre-gl-worker.mjs?worker&url';\n * setMapLibreWorkerUrl(workerUrl);\n *\n * // webpack 5, rspack, Next.js\n * setMapLibreWorkerUrl(new URL('maplibre-gl/dist/maplibre-gl-worker.mjs', import.meta.url).toString());\n * ```\n *\n * Calling MapLibre's own `setWorkerUrl` does the same. A function in place of the URL is called\n * when a MapLibre map is first drawn, so code that finds it — loading the worker's script, say —\n * runs only on a page that shows one.\n */\nexport function setMapLibreWorkerUrl(url: string | (() => string | Promise<string>)): void {\n workerUrl = url;\n finding = null;\n}\n\n// The function's answer, found once however many maps are drawn while it runs.\nlet finding: Promise<string> | null = null;\n\n/** The worker URL set, found now if a function was set; null when MapLibre is left to find it. */\nexport async function mapLibreWorkerUrl(): Promise<string | null> {\n if (typeof workerUrl !== 'function') return workerUrl;\n const find = workerUrl;\n finding ??= Promise.resolve().then(find);\n return await finding;\n}\n","// The map's own elements — pins, clusters, the popup's place — drawn with Fluent's tokens, so they\n// follow the portal's theme and accent on every provider. Hex values only as `var()` fallbacks, for\n// a page without Fluent's tokens.\nexport const MAP_CSS = `\n.ppp-map-host, .ppp-map-surface { position: absolute; inset: 0; }\n.ppp-map-marker {\n all: unset;\n box-sizing: content-box;\n display: block;\n width: 24px;\n height: 32px;\n cursor: pointer;\n filter: drop-shadow(0 1px 2px rgba(0, 0, 0, 0.35));\n transition: transform 0.1s ease-out;\n transform-origin: 50% 100%;\n}\n.ppp-map-marker svg { display: block; }\n.ppp-map-marker .ppp-map-marker-pin {\n fill: var(--ppp-map-item-color);\n stroke: var(--colorNeutralBackground1, #ffffff);\n stroke-width: 1.5;\n}\n.ppp-map-marker .ppp-map-marker-dot { fill: var(--colorNeutralBackground1, #ffffff); }\n.ppp-map-marker[data-labeled] { position: relative; }\n.ppp-map-marker[data-labeled] .ppp-map-marker-dot { display: none; }\n.ppp-map-marker-label {\n position: absolute;\n left: 0;\n top: 1px;\n width: 24px;\n height: 22px;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--colorNeutralForegroundOnBrand, #ffffff);\n font-family: var(--fontFamilyBase, 'Segoe UI', sans-serif);\n font-size: 11px;\n font-weight: var(--fontWeightBold, 700);\n line-height: 1;\n letter-spacing: -0.02em;\n pointer-events: none;\n}\n.ppp-map-marker-label[data-length=\"3\"] { font-size: 9px; }\n.ppp-map-marker-label[data-length=\"4\"] { font-size: 7.5px; }\n.ppp-map-marker-label[data-length=\"5\"] { font-size: 6px; }\n.ppp-map-marker:hover, .ppp-map-marker[data-selected] { transform: scale(1.2); }\n.ppp-map-marker:focus-visible { outline: none; }\n.ppp-map-marker:focus-visible .ppp-map-marker-pin {\n stroke: var(--colorStrokeFocus2, #000000);\n stroke-width: 2.5;\n}\n.ppp-map-cluster {\n all: unset;\n box-sizing: border-box;\n display: flex;\n align-items: center;\n justify-content: center;\n min-width: 32px;\n height: 32px;\n padding: 0 var(--spacingHorizontalS, 8px);\n border-radius: var(--borderRadiusCircular, 10000px);\n border: var(--strokeWidthThick, 2px) solid var(--colorNeutralBackground1, #ffffff);\n background: var(--ppp-map-item-color, var(--colorBrandBackground, #0f6cbd));\n color: var(--colorNeutralForegroundOnBrand, #ffffff);\n font-family: var(--fontFamilyBase, 'Segoe UI', sans-serif);\n font-size: var(--fontSizeBase200, 12px);\n font-weight: var(--fontWeightSemibold, 600);\n line-height: 1;\n cursor: pointer;\n box-shadow: var(--shadow4, 0 1px 2px rgba(0, 0, 0, 0.3));\n transition: transform 0.1s ease-out;\n}\n.ppp-map-cluster[data-size=\"medium\"] { min-width: 38px; height: 38px; }\n.ppp-map-cluster[data-size=\"large\"] { min-width: 44px; height: 44px; font-size: var(--fontSizeBase300, 14px); }\n.ppp-map-cluster:hover { filter: brightness(0.92); transform: scale(1.08); }\n.ppp-map-cluster:focus-visible { outline: var(--strokeWidthThick, 2px) solid var(--colorStrokeFocus2, #000000); outline-offset: 1px; }\n.ppp-map-place {\n display: block;\n width: 24px;\n height: 32px;\n pointer-events: none;\n filter: drop-shadow(0 1px 2px rgba(0, 0, 0, 0.35));\n}\n.ppp-map-place svg { display: block; }\n.ppp-map-place .ppp-map-marker-pin {\n fill: var(--colorPaletteRedBackground3, #d13438);\n stroke: var(--colorNeutralBackground1, #ffffff);\n stroke-width: 1.5;\n}\n.ppp-map-place .ppp-map-marker-dot { fill: var(--colorNeutralBackground1, #ffffff); }\n.ppp-map-search {\n position: absolute;\n top: 10px;\n left: 10px;\n z-index: 3;\n box-sizing: border-box;\n width: min(320px, calc(100% - 64px));\n font-family: var(--fontFamilyBase, 'Segoe UI', sans-serif);\n font-size: var(--fontSizeBase300, 14px);\n line-height: var(--lineHeightBase300, 20px);\n color: var(--colorNeutralForeground1, #242424);\n}\n.ppp-map-search-field {\n position: relative;\n display: flex;\n align-items: center;\n gap: var(--spacingHorizontalXS, 4px);\n box-sizing: border-box;\n height: 32px;\n padding: 0 var(--spacingHorizontalXS, 4px) 0 var(--spacingHorizontalS, 8px);\n background: var(--colorNeutralBackground1, #ffffff);\n border: var(--strokeWidthThin, 1px) solid var(--colorNeutralStroke1, #d1d1d1);\n border-bottom-color: var(--colorNeutralStrokeAccessible, #616161);\n border-radius: var(--borderRadiusMedium, 4px);\n box-shadow: var(--shadow4, 0 1px 2px rgba(0, 0, 0, 0.14));\n}\n.ppp-map-search-field::after {\n content: '';\n position: absolute;\n left: -1px;\n right: -1px;\n bottom: -1px;\n height: 2px;\n border-radius: 0 0 var(--borderRadiusMedium, 4px) var(--borderRadiusMedium, 4px);\n background: var(--colorCompoundBrandStroke, #0f6cbd);\n transform: scaleX(0);\n transition: transform 0.1s ease-out;\n}\n.ppp-map-search-field:focus-within::after { transform: scaleX(1); }\n.ppp-map-search-icon { display: flex; color: var(--colorNeutralForeground3, #616161); }\n.ppp-map-search-input {\n all: unset;\n flex: 1;\n min-width: 0;\n color: var(--colorNeutralForeground1, #242424);\n font: inherit;\n}\n.ppp-map-search-input::placeholder { color: var(--colorNeutralForeground4, #707070); opacity: 1; }\n.ppp-map-search-clear {\n all: unset;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n border-radius: var(--borderRadiusMedium, 4px);\n color: var(--colorNeutralForeground3, #616161);\n cursor: pointer;\n}\n.ppp-map-search-clear[hidden] { display: none; }\n.ppp-map-search-clear:hover { background: var(--colorSubtleBackgroundHover, #f5f5f5); color: var(--colorNeutralForeground1, #242424); }\n.ppp-map-search-clear:focus-visible { outline: var(--strokeWidthThick, 2px) solid var(--colorStrokeFocus2, #000000); }\n.ppp-map-search-panel {\n margin-top: var(--spacingVerticalXS, 4px);\n padding: var(--spacingVerticalXS, 4px);\n background: var(--colorNeutralBackground1, #ffffff);\n border-radius: var(--borderRadiusMedium, 4px);\n box-shadow: var(--shadow16, 0 6px 14px rgba(0, 0, 0, 0.14));\n max-height: 300px;\n overflow-y: auto;\n}\n.ppp-map-search-panel[hidden], .ppp-map-search-list[hidden], .ppp-map-search-status[hidden] { display: none; }\n.ppp-map-search-list { margin: 0; padding: 0; list-style: none; }\n.ppp-map-search-option {\n display: flex;\n flex-direction: column;\n padding: var(--spacingVerticalSNudge, 6px) var(--spacingHorizontalS, 8px);\n border-radius: var(--borderRadiusMedium, 4px);\n cursor: pointer;\n}\n.ppp-map-search-option:hover, .ppp-map-search-option[data-active] { background: var(--colorNeutralBackground1Hover, #f5f5f5); }\n.ppp-map-search-detail, .ppp-map-search-status {\n color: var(--colorNeutralForeground3, #616161);\n font-size: var(--fontSizeBase200, 12px);\n line-height: var(--lineHeightBase200, 16px);\n}\n.ppp-map-search-status { padding: var(--spacingVerticalSNudge, 6px) var(--spacingHorizontalS, 8px); }\n.ppp-map-search-status:empty { display: none; }\n.ppp-map-popup-layer { position: absolute; inset: 0; overflow: hidden; pointer-events: none; z-index: 2; }\n.ppp-map-popup-anchor { position: absolute; left: 0; top: 0; pointer-events: auto; }\n.ppp-map-popup-anchor[hidden] { display: none; }\n/* The print button over the top right corner, MapLibre's zoom buttons moved down beneath it. Its\n 10px matches the margin MapLibre gives its controls. */\n.ppp-map-print { position: absolute; top: 10px; right: 10px; z-index: 3; }\n.ppp-map-printable .maplibregl-ctrl-top-right { top: 38px; }\n.ppp-map-print-sheet { display: none; }\n/* A map printed as it is on the page — a provider whose map can't be copied into an image: only it\n and what is printed with it, every other element on the way to it left out. */\n@media print {\n html.ppp-map-printing [data-ppp-map-print-path] > :not([data-ppp-map-print-path]):not(.ppp-map-print-target):not(.ppp-map-print-sheet) {\n display: none !important;\n }\n html.ppp-map-printing [data-ppp-map-print-path] {\n display: block !important;\n position: static !important;\n margin: 0 !important;\n padding: 0 !important;\n border: 0 !important;\n width: auto !important;\n height: auto !important;\n min-height: 0 !important;\n max-height: none !important;\n overflow: visible !important;\n transform: none !important;\n box-shadow: none !important;\n background: none !important;\n }\n html.ppp-map-printing .ppp-map-print-target { break-inside: avoid; }\n html.ppp-map-printing .ppp-map-print-target :is(.ppp-map-print, .ppp-map-search, .ppp-map-popup-close) { display: none !important; }\n html.ppp-map-printing .ppp-map-print-target .ppp-map-popup { max-height: none !important; overflow: visible !important; }\n html.ppp-map-printing .ppp-map-print-sheet { display: block; }\n}\n`;\n\n/** Adds a stylesheet to the document once, by id. */\nexport function ensureStyleSheet(document: Document, id: string, css: string): void {\n if (document.getElementById(id)) return;\n const style = document.createElement('style');\n style.id = id;\n style.textContent = css;\n document.head.appendChild(style);\n}\n\n/** Adds the map's own stylesheet to the document once. */\nexport function ensureMapStyles(document: Document): void {\n ensureStyleSheet(document, 'ppp-map-styles', MAP_CSS);\n}\n","import type { MapOptions } from 'maplibre-gl';\nimport type {\n AzureMapsAccessToken,\n AzureMapsSettings,\n EsriSettings,\n MapLibreSettings,\n OpenStreetMapSettings,\n} from '../provider.js';\nimport type { MapStyle } from '../types.js';\n\n/** A MapLibre style document: MapLibre takes one, or its URL, but doesn't export its type. */\nexport type StyleSpecification = Exclude<NonNullable<MapOptions['style']>, string>;\n\n/** A base map MapLibre draws: its style, and what requests to its provider need. */\nexport interface Basemap {\n style: StyleSpecification | string;\n /** Attribution shown with the style's own, as HTML: what the provider's terms ask for. */\n attribution?: string;\n /** The Azure Maps tilesets drawn, whose attribution is asked for as the view moves. */\n azureTilesets?: string[];\n}\n\nexport const OPEN_STREET_MAP_TILES = 'https://tile.openstreetmap.org/{z}/{x}/{y}.png';\nexport const OPEN_STREET_MAP_ATTRIBUTION =\n '&copy; <a href=\"https://www.openstreetmap.org/copyright\" target=\"_blank\" rel=\"noopener\">OpenStreetMap</a> contributors';\n\nexport const AZURE_MAPS_ENDPOINT = 'https://atlas.microsoft.com';\nexport const AZURE_MAPS_API_VERSION = '2024-04-01';\n\nexport const ESRI_STYLES_ENDPOINT = 'https://basemapstyles-api.arcgis.com/arcgis/rest/services/styles/v2/styles';\nexport const ESRI_ATTRIBUTION = 'Powered by <a href=\"https://www.esri.com/\" target=\"_blank\" rel=\"noopener\">Esri</a>';\n\n/**\n * Raster tiles drawn darker for a dark theme, for tiles that have no dark style of their own:\n * lightness turned around (brightness from 1 down to 0) and hue turned back, so water stays blue.\n */\nconst DARKENED_RASTER = {\n 'raster-brightness-min': 0.92,\n 'raster-brightness-max': 0.08,\n 'raster-hue-rotate': 180,\n 'raster-saturation': -0.35,\n 'raster-contrast': 0.1,\n} as const;\n\n/** A style of raster tile layers, one source each, drawn in order. */\nexport function rasterStyle(\n layers: readonly { tiles: string; attribution?: string; maxZoom?: number; darken?: boolean }[],\n): StyleSpecification {\n const style: StyleSpecification = { version: 8, sources: {}, layers: [] };\n layers.forEach((layer, index) => {\n const id = `ppp-base-${index}`;\n style.sources[id] = {\n type: 'raster',\n tiles: [layer.tiles],\n tileSize: 256,\n ...(layer.attribution ? { attribution: layer.attribution } : {}),\n ...(layer.maxZoom !== undefined ? { maxzoom: layer.maxZoom } : {}),\n };\n style.layers.push({ id, type: 'raster', source: id, ...(layer.darken ? { paint: { ...DARKENED_RASTER } } : {}) });\n });\n return style;\n}\n\n/** OpenStreetMap's tiles, or the ones `tileUrl` names; darkened in a dark theme, as they have no dark style. */\nexport function openStreetMapBasemap(settings: OpenStreetMapSettings, dark: boolean): Basemap {\n return {\n style: rasterStyle([\n {\n tiles: settings.tileUrl || OPEN_STREET_MAP_TILES,\n attribution: settings.attribution || (settings.tileUrl ? '' : OPEN_STREET_MAP_ATTRIBUTION),\n maxZoom: 19,\n darken: dark,\n },\n ]),\n };\n}\n\n/** The Azure Maps raster tilesets for a style: its road or dark gray style, imagery, or both. */\nexport function azureMapsTilesets(style: MapStyle, dark: boolean): string[] {\n switch (style) {\n case 'satellite':\n return ['microsoft.imagery'];\n case 'hybrid':\n return ['microsoft.imagery', dark ? 'microsoft.base.hybrid.darkgrey' : 'microsoft.base.hybrid.road'];\n default:\n return [dark ? 'microsoft.base.darkgrey' : 'microsoft.base.road'];\n }\n}\n\n/** An Azure Maps tile URL template for a tileset, in the viewer's language. */\nexport function azureMapsTileUrl(tilesetId: string, language: string, view: string | undefined): string {\n const query = new URLSearchParams({\n 'api-version': AZURE_MAPS_API_VERSION,\n tilesetId,\n tileSize: '256',\n language,\n view: view || 'Auto',\n });\n // The placeholders stay as they are, for MapLibre to fill in per tile.\n return `${AZURE_MAPS_ENDPOINT}/map/tile?${query}&zoom={z}&x={x}&y={y}`;\n}\n\nexport function azureMapsBasemap(settings: AzureMapsSettings, style: MapStyle, dark: boolean, language: string): Basemap {\n const tilesets = azureMapsTilesets(style, dark);\n return {\n style: rasterStyle(\n tilesets.map((tileset) => ({\n tiles: azureMapsTileUrl(tileset, language, settings.view),\n maxZoom: tileset === 'microsoft.imagery' ? 19 : 22,\n })),\n ),\n azureTilesets: tilesets,\n };\n}\n\n/** The headers that sign a request to Azure Maps in with the portal's token; null before there is one. */\nexport function azureMapsHeaders(token: AzureMapsAccessToken | null): Record<string, string> | null {\n return token ? { Authorization: `Bearer ${token.accessToken}`, 'x-ms-client-id': token.clientId } : null;\n}\n\n/** The ArcGIS basemap style for a map style: the road style (or its dark one), imagery, or imagery with labels. */\nexport function esriStyleName(settings: EsriSettings, style: MapStyle, dark: boolean): string {\n switch (style) {\n case 'satellite':\n return 'arcgis/imagery/standard';\n case 'hybrid':\n return 'arcgis/imagery';\n default:\n return dark ? settings.darkStyleName || 'arcgis/dark-gray' : settings.styleName || 'arcgis/streets';\n }\n}\n\n// The languages the ArcGIS basemap styles take by more than their two letters.\nconst ESRI_REGIONAL_LANGUAGES = new Set(['pt-BR', 'pt-PT', 'zh-CN', 'zh-HK', 'zh-TW']);\n\n/** The ArcGIS language code for a culture: its two letters, or the culture for those it tells apart. */\nexport function esriLanguage(culture: string): string {\n const match = [...ESRI_REGIONAL_LANGUAGES].find((language) => language.toLowerCase() === culture.toLowerCase());\n return match ?? culture.split('-')[0]!.toLowerCase();\n}\n\nexport function esriBasemap(settings: EsriSettings, apiKey: string, style: MapStyle, dark: boolean, language: string): Basemap {\n const query = new URLSearchParams({ token: apiKey, language: esriLanguage(language) });\n return {\n style: `${ESRI_STYLES_ENDPOINT}/${esriStyleName(settings, style, dark)}?${query}`,\n attribution: ESRI_ATTRIBUTION,\n };\n}\n\n/**\n * A request to ArcGIS carrying the key: the style's own URLs usually do already, and one that\n * doesn't — a sprite or font on another of its hosts — gets it added.\n */\nexport function withEsriToken(url: string, apiKey: string): string {\n let parsed: URL;\n try {\n parsed = new URL(url);\n } catch {\n return url;\n }\n if (!/(^|\\.)arcgis(online)?\\.com$/i.test(parsed.hostname) || parsed.searchParams.has('token')) return url;\n // Added to the text rather than through the URL, which would escape a template's braces.\n const [path, hash] = url.split('#', 2) as [string, string | undefined];\n return `${path}${path.includes('?') ? '&' : '?'}token=${encodeURIComponent(apiKey)}${hash === undefined ? '' : `#${hash}`}`;\n}\n\n/** The style a MapLibre provider names for a map style, or its raster tiles. */\nexport function mapLibreBasemap(settings: MapLibreSettings, style: MapStyle, dark: boolean): Basemap {\n const satellite = settings.satelliteStyleUrl;\n const url =\n style === 'hybrid'\n ? settings.hybridStyleUrl || satellite\n : style === 'satellite'\n ? satellite\n : dark\n ? settings.darkStyleUrl\n : undefined;\n\n const styleUrl = url || settings.styleUrl;\n if (styleUrl) return { style: styleUrl };\n\n if (!settings.tileUrl) throw new Error('A mapLibre provider needs a styleUrl or a tileUrl.');\n return {\n style: rasterStyle([\n {\n tiles: settings.tileUrl,\n ...(settings.attribution ? { attribution: settings.attribution } : {}),\n maxZoom: settings.maxZoom ?? 19,\n darken: dark,\n },\n ]),\n };\n}\n","import {\n Map as MapLibreMap,\n Marker,\n NavigationControl,\n setWorkerUrl,\n type IControl,\n type MapMouseEvent,\n type MapOptions,\n type RequestParameters,\n} from 'maplibre-gl';\nimport mapLibreCss from 'maplibre-gl/dist/maplibre-gl.css';\nimport { circlePath } from '../geo.js';\nimport { azureMapsGeocoder, esriGeocoder, nominatimGeocoder } from '../geocoders.js';\nimport { mapLibreWorkerUrl } from '../maplibre-worker.js';\nimport type {\n AzureMapsAccessToken,\n AzureMapsSettings,\n EsriSettings,\n MapGeocoder,\n MapGestureHelp,\n MapLibreSettings,\n MapOverlay,\n MapProvider,\n MapProviderKeys,\n MapSurface,\n MapSurfaceContext,\n OpenStreetMapSettings,\n} from '../provider.js';\nimport { ensureStyleSheet } from '../styles.js';\nimport type { MapBounds, MapCamera, MapPoint, MapPosition, MapShape, MapStyle, MapView } from '../types.js';\nimport {\n AZURE_MAPS_API_VERSION,\n AZURE_MAPS_ENDPOINT,\n azureMapsBasemap,\n azureMapsHeaders,\n esriBasemap,\n mapLibreBasemap,\n openStreetMapBasemap,\n withEsriToken,\n type Basemap,\n} from './basemaps.js';\n\ntype MapLibreProviderName = 'azureMaps' | 'esri' | 'openStreetMap' | 'mapLibre';\ntype MapLibreProviderSettings = (AzureMapsSettings | EsriSettings | OpenStreetMapSettings | MapLibreSettings) & MapProviderKeys;\n\n// The map's zoom counts 256-pixel tiles, as Google's and most tile services' do; MapLibre's counts\n// 512-pixel ones, one level lower for the same view.\nconst toMapLibreZoom = (zoom: number) => zoom - 1;\nconst fromMapLibreZoom = (zoom: number) => zoom + 1;\n\nconst SHAPES_SOURCE = 'ppp-shapes';\nconst SHAPE_LAYERS = ['ppp-shapes-fill', 'ppp-shapes-outline', 'ppp-shapes-line'];\n\n/** The provider for one of the base maps MapLibre draws. */\nexport function mapLibreProvider(name: MapLibreProviderName): MapProvider<MapLibreProviderSettings> {\n return { name, create: (context) => MapLibreSurface.create(context) };\n}\n\n// Each provider's own address search: Azure Maps' with the portal's token, Esri's with its key, and\n// a Nominatim server for OpenStreetMap's tiles and any other style.\nfunction geocoderFor(settings: MapLibreProviderSettings, azureToken: AzureMapsToken | null): MapGeocoder {\n switch (settings.name) {\n case 'azureMaps':\n return azureMapsGeocoder(AZURE_MAPS_ENDPOINT, () => azureMapsHeaders(azureToken?.current ?? null), settings.view);\n case 'esri':\n return esriGeocoder(settings.apiKey ?? '');\n default:\n return nominatimGeocoder(settings.geocoderUrl || undefined);\n }\n}\n\nfunction basemapFor(settings: MapLibreProviderSettings, style: MapStyle, dark: boolean, language: string): Basemap {\n switch (settings.name) {\n case 'azureMaps':\n return azureMapsBasemap(settings, style, dark, language);\n case 'esri':\n return esriBasemap(settings, settings.apiKey ?? '', style, dark, language);\n case 'openStreetMap':\n return openStreetMapBasemap(settings, dark);\n case 'mapLibre':\n return mapLibreBasemap(settings, style, dark);\n }\n}\n\n/** The portal's Azure Maps token kept current, renewed shortly before it expires. */\nclass AzureMapsToken {\n private token: AzureMapsAccessToken | null = null;\n private timer: ReturnType<typeof setTimeout> | undefined;\n private disposed = false;\n\n constructor(private readonly getToken: () => Promise<AzureMapsAccessToken>) {}\n\n get current(): AzureMapsAccessToken | null {\n return this.token;\n }\n\n async start(): Promise<void> {\n this.token = await this.getToken();\n this.schedule();\n }\n\n dispose(): void {\n this.disposed = true;\n clearTimeout(this.timer);\n }\n\n private schedule(): void {\n // A renewal already on its way when the map went comes back to no one.\n if (this.disposed) return;\n // Five minutes before the token expires — when the portal hands out a new one — or in half an\n // hour when its expiry can't be read.\n const expiresOn = Date.parse(this.token!.expiresOn);\n const delay = Number.isNaN(expiresOn) ? 30 * 60_000 : Math.max(30_000, expiresOn - Date.now() - 5 * 60_000);\n this.timer = setTimeout(() => this.renew(), delay);\n }\n\n // Asks again a minute after each failure — a refusal over the rate limit, the network — until\n // one comes back or the map goes.\n private renew(): void {\n this.getToken().then(\n (token) => {\n this.token = token;\n this.schedule();\n },\n () => {\n if (!this.disposed) this.timer = setTimeout(() => this.renew(), 60_000);\n },\n );\n }\n}\n\n/** A line of attribution text in the map's corner, beside MapLibre's own. */\nclass AttributionText implements IControl {\n private readonly element: HTMLElement;\n private readonly inner: HTMLElement;\n\n constructor(document: Document) {\n this.element = document.createElement('div');\n this.element.className = 'maplibregl-ctrl maplibregl-ctrl-attrib';\n this.inner = document.createElement('div');\n this.inner.className = 'maplibregl-ctrl-attrib-inner';\n this.element.appendChild(this.inner);\n this.element.hidden = true;\n }\n\n set text(value: string) {\n this.inner.textContent = value;\n this.element.hidden = !value;\n }\n\n onAdd(): HTMLElement {\n return this.element;\n }\n\n onRemove(): void {\n this.element.remove();\n }\n}\n\nclass MapLibreSurface implements MapSurface {\n readonly geocoder: MapGeocoder;\n private shapes: readonly MapShape[] = [];\n private loaded = false;\n private reportedError = false;\n private attribution: AttributionText | null = null;\n private attributionRequest: AbortController | null = null;\n private attributionTimer: ReturnType<typeof setTimeout> | undefined;\n private azureTilesets: string[] = [];\n private style: MapStyle;\n private dark: boolean;\n\n private constructor(\n private readonly map: MapLibreMap,\n private readonly context: MapSurfaceContext<MapLibreProviderSettings>,\n private readonly azureToken: AzureMapsToken | null,\n ) {\n this.style = context.style;\n this.dark = context.dark;\n this.geocoder = geocoderFor(context.settings, azureToken);\n }\n\n static async create(context: MapSurfaceContext<MapLibreProviderSettings>): Promise<MapLibreSurface> {\n const document = context.container.ownerDocument;\n ensureStyleSheet(document, 'ppp-map-maplibre-styles', mapLibreCss);\n\n const workerUrl = await mapLibreWorkerUrl();\n if (workerUrl) setWorkerUrl(workerUrl);\n\n const settings = context.settings;\n let azureToken: AzureMapsToken | null = null;\n if (settings.name === 'azureMaps') {\n // The portal's token, which the React or Blazor map asks the portal for.\n if (!settings.getToken) throw new Error(\"Azure Maps draws with the portal's token, and the map has none to ask for.\");\n azureToken = new AzureMapsToken(settings.getToken);\n await azureToken.start();\n }\n if (settings.name === 'esri' && !settings.apiKey) throw new Error(\"Esri needs the portal's API key: PowerPortalsPro:Maps:Esri:ApiKey.\");\n\n const basemap = basemapFor(settings, context.style, context.dark, context.language);\n const options: MapOptions = {\n container: context.container,\n style: basemap.style,\n center: [context.camera.center.longitude, context.camera.center.latitude],\n zoom: toMapLibreZoom(context.camera.zoom),\n attributionControl: { compact: true, ...(basemap.attribution ? { customAttribution: basemap.attribution } : {}) },\n transformRequest: (url) => transformRequest(settings, azureToken, url),\n // A map in a page that scrolls zooms with Ctrl (⌘) and the wheel, and pans with two fingers,\n // as Google's does in one, so the page still scrolls past it.\n ...(context.gestureHelp\n ? {\n cooperativeGestures: true,\n locale: gestureLocale(context.gestureHelp),\n }\n : {}),\n // Last, so the host's own MapLibre options win over the map's.\n ...(context.nativeOptions as Partial<MapOptions> | undefined),\n };\n\n const map = new MapLibreMap(options);\n map.addControl(new NavigationControl({ showCompass: false }), 'top-right');\n\n const surface = new MapLibreSurface(map, context, azureToken);\n surface.listen(basemap);\n return surface;\n }\n\n get native(): unknown {\n return this.map;\n }\n\n getView(): MapView {\n const center = this.map.getCenter();\n const bounds = this.map.getBounds();\n return {\n center: { latitude: center.lat, longitude: center.lng },\n zoom: fromMapLibreZoom(this.map.getZoom()),\n bounds: { north: bounds.getNorth(), south: bounds.getSouth(), east: bounds.getEast(), west: bounds.getWest() },\n };\n }\n\n setCamera(camera: MapCamera, animate: boolean): void {\n const options = {\n center: [camera.center.longitude, camera.center.latitude] as [number, number],\n zoom: toMapLibreZoom(camera.zoom),\n };\n if (animate) this.map.easeTo(options);\n else this.map.jumpTo(options);\n }\n\n fitBounds(bounds: MapBounds, padding: number, maxZoom: number): void {\n this.map.fitBounds(\n [\n [bounds.west, bounds.south],\n [bounds.east, bounds.north],\n ],\n { padding, maxZoom: toMapLibreZoom(maxZoom), animate: false },\n );\n }\n\n panBy(x: number, y: number): void {\n this.map.panBy([x, y]);\n }\n\n project(position: MapPosition): MapPoint {\n const point = this.map.project([position.longitude, position.latitude]);\n return { x: point.x, y: point.y };\n }\n\n addOverlay(element: HTMLElement, position: MapPosition, anchor: 'bottom' | 'center'): MapOverlay {\n const marker = new Marker({ element, anchor }).setLngLat([position.longitude, position.latitude]).addTo(this.map);\n return {\n setPosition: (next) => marker.setLngLat([next.longitude, next.latitude]),\n remove: () => marker.remove(),\n };\n }\n\n setShapes(shapes: readonly MapShape[]): void {\n this.shapes = shapes;\n if (this.loaded) this.drawShapes();\n }\n\n setStyle(style: MapStyle, dark: boolean): boolean {\n if (style === this.style && dark === this.dark) return true;\n this.style = style;\n this.dark = dark;\n\n const basemap = basemapFor(this.context.settings, style, dark, this.context.language);\n this.azureTilesets = basemap.azureTilesets ?? [];\n this.loaded = false;\n // A new style drops the layers added to the old one: the shapes go back on once it loads.\n this.map.setStyle(basemap.style, { diff: false });\n this.map.once('style.load', () => {\n this.loaded = true;\n this.drawShapes();\n });\n this.updateAttribution();\n return true;\n }\n\n setGestureHelp(help: MapGestureHelp): void {\n // MapLibre reads its strings as it builds the hint, and has no way to change them after: the\n // hint is built again with the new ones.\n Object.assign(this.map._locale, gestureLocale(help));\n const handler = this.map.cooperativeGestures;\n if (handler.isEnabled()) {\n handler.disable();\n handler.enable();\n }\n }\n\n resize(): void {\n this.map.resize();\n }\n\n capture(pixelRatio: number): Promise<HTMLCanvasElement> {\n const map = this.map;\n const previous = map.getPixelRatio();\n // Drawn at the copy's own sharpness — finer for paper, coarser for a map too big to copy whole —\n // then as it was.\n const changed = pixelRatio !== previous;\n if (changed) map.setPixelRatio(pixelRatio);\n\n return new Promise<HTMLCanvasElement>((resolve, reject) => {\n // Once every tile in view is in — or, when some never come or the page is in the background,\n // where frames wait, after a while with whatever the map has.\n const copy = () => {\n clearTimeout(timer);\n map.off('idle', copy);\n try {\n // Drawn now and copied at once, before the browser clears the frame: MapLibre keeps no copy.\n map.redraw();\n const source = map.getCanvas();\n const canvas = source.ownerDocument.createElement('canvas');\n canvas.width = source.width;\n canvas.height = source.height;\n canvas.getContext('2d')!.drawImage(source, 0, 0);\n resolve(canvas);\n } catch (error) {\n reject(error instanceof Error ? error : new Error(String(error)));\n } finally {\n if (changed) map.setPixelRatio(previous);\n }\n };\n const timer = setTimeout(copy, 10_000);\n map.once('idle', copy);\n map.triggerRepaint();\n });\n }\n\n attributionText(): string {\n // MapLibre's own line and Azure Maps' beside it.\n return [...this.context.container.querySelectorAll('.maplibregl-ctrl-attrib-inner')]\n .map((element) => element.textContent?.trim() ?? '')\n .filter(Boolean)\n .join(' · ');\n }\n\n dispose(): void {\n clearTimeout(this.attributionTimer);\n this.attributionRequest?.abort();\n this.azureToken?.dispose();\n this.map.remove();\n }\n\n private listen(basemap: Basemap): void {\n const events = this.context.events;\n this.azureTilesets = basemap.azureTilesets ?? [];\n if (this.context.settings.name === 'azureMaps') {\n this.attribution = new AttributionText(this.context.container.ownerDocument);\n this.map.addControl(this.attribution, 'bottom-right');\n }\n\n this.map.once('style.load', () => {\n this.loaded = true;\n this.drawShapes();\n });\n this.map.once('load', () => {\n events.viewChanged();\n this.updateAttribution();\n });\n\n this.map.on('move', () => events.viewChanging());\n this.map.on('moveend', () => {\n events.viewChanged();\n this.updateAttribution();\n });\n\n this.map.on('click', (event: MapMouseEvent) => {\n // A pin or cluster is an element over the map, whose click is its own.\n const target = event.originalEvent.target as Element | null;\n if (target?.closest?.('.ppp-map-marker, .ppp-map-cluster')) return;\n\n const position = { latitude: event.lngLat.lat, longitude: event.lngLat.lng };\n const point = { x: event.point.x, y: event.point.y };\n const layers = SHAPE_LAYERS.filter((layer) => this.map.getLayer(layer));\n const hit = layers.length ? this.map.queryRenderedFeatures(event.point, { layers })[0] : undefined;\n const id = hit?.properties?.['id'];\n if (typeof id === 'string') events.shapeClick(id, position, point);\n else events.click(position, point);\n });\n\n for (const layer of SHAPE_LAYERS) {\n this.map.on('mouseenter', layer, () => (this.map.getCanvas().style.cursor = 'pointer'));\n this.map.on('mouseleave', layer, () => (this.map.getCanvas().style.cursor = ''));\n }\n\n this.map.on('error', (event) => {\n // A tile that fails to load is MapLibre's to retry or leave blank. One refused — a wrong\n // key, an origin the account doesn't allow — or a style that never loads is the map failing.\n const status = (event.error as { status?: number } | undefined)?.status;\n if (this.reportedError || (this.loaded && status !== 401 && status !== 403)) return;\n this.reportedError = true;\n events.error(event.error?.message || 'The map could not be loaded.');\n });\n }\n\n private drawShapes(): void {\n const features = this.shapes.map((shape) => {\n const properties = { id: shape.id, color: shape.color ?? '', width: shape.kind === 'polyline' ? shape.width ?? 3 : 2 };\n switch (shape.kind) {\n case 'polyline':\n return feature('LineString', shape.path.map(toCoordinates), properties);\n case 'polygon': {\n const ring = shape.path.map(toCoordinates);\n if (ring.length && (ring[0]![0] !== ring.at(-1)![0] || ring[0]![1] !== ring.at(-1)![1])) ring.push(ring[0]!);\n return feature('Polygon', [ring], properties);\n }\n case 'circle':\n return feature('Polygon', [circlePath(shape.center, shape.radius).map(toCoordinates)], properties);\n }\n });\n\n const data = { type: 'FeatureCollection' as const, features };\n const source = this.map.getSource(SHAPES_SOURCE) as { setData?: (value: typeof data) => void } | undefined;\n if (source?.setData) {\n source.setData(data);\n return;\n }\n\n this.map.addSource(SHAPES_SOURCE, { type: 'geojson', data });\n this.map.addLayer({\n id: 'ppp-shapes-fill',\n type: 'fill',\n source: SHAPES_SOURCE,\n filter: ['==', ['geometry-type'], 'Polygon'],\n paint: { 'fill-color': ['get', 'color'], 'fill-opacity': 0.2 },\n });\n this.map.addLayer({\n id: 'ppp-shapes-outline',\n type: 'line',\n source: SHAPES_SOURCE,\n filter: ['==', ['geometry-type'], 'Polygon'],\n paint: { 'line-color': ['get', 'color'], 'line-width': ['get', 'width'] },\n });\n this.map.addLayer({\n id: 'ppp-shapes-line',\n type: 'line',\n source: SHAPES_SOURCE,\n filter: ['==', ['geometry-type'], 'LineString'],\n layout: { 'line-cap': 'round', 'line-join': 'round' },\n paint: { 'line-color': ['get', 'color'], 'line-width': ['get', 'width'] },\n });\n }\n\n // Azure Maps' terms ask for the attribution its API gives for the tiles in view, which changes as\n // the map moves: asked for once the view settles, the last request winning.\n private updateAttribution(): void {\n const settings = this.context.settings;\n if (settings.name !== 'azureMaps' || !this.attribution) return;\n\n clearTimeout(this.attributionTimer);\n this.attributionTimer = setTimeout(() => {\n this.attributionRequest?.abort();\n const request = new AbortController();\n this.attributionRequest = request;\n\n const view = this.getView();\n const headers = azureMapsHeaders(this.azureToken?.current ?? null) ?? {};\n const bounds = [\n Math.max(-180, view.bounds.west),\n Math.max(-90, view.bounds.south),\n Math.min(180, view.bounds.east),\n Math.min(90, view.bounds.north),\n ].join(',');\n\n Promise.all(\n this.azureTilesets.map(async (tilesetId) => {\n const query = new URLSearchParams({\n 'api-version': AZURE_MAPS_API_VERSION,\n tilesetId,\n zoom: String(Math.max(0, Math.round(view.zoom))),\n bounds,\n });\n const response = await fetch(`${AZURE_MAPS_ENDPOINT}/map/attribution?${query}`, { headers, signal: request.signal });\n if (!response.ok) return [];\n return ((await response.json()) as { copyrights?: string[] }).copyrights ?? [];\n }),\n ).then(\n (lists) => {\n if (request.signal.aborted || !this.attribution) return;\n // Each copyright comes as a fragment of HTML; only its text is shown.\n const parser = new DOMParser();\n const texts = lists\n .flat()\n .map((html) => parser.parseFromString(html, 'text/html').body.textContent?.trim() ?? '')\n .filter(Boolean);\n this.attribution.text = [...new Set(texts)].join(', ');\n },\n () => {\n // Aborted by a newer view, or Azure Maps unreachable: the last attribution stays.\n },\n );\n }, 250);\n }\n}\n\nfunction toCoordinates(position: MapPosition): [number, number] {\n return [position.longitude, position.latitude];\n}\n\nfunction feature<TType extends 'LineString' | 'Polygon'>(\n type: TType,\n coordinates: TType extends 'LineString' ? [number, number][] : [number, number][][],\n properties: Record<string, unknown>,\n) {\n return { type: 'Feature' as const, geometry: { type, coordinates }, properties } as GeoJSON.Feature;\n}\n\n/** Signs a request to the provider in: Azure Maps' headers, or the ArcGIS key on ArcGIS's hosts. */\nfunction transformRequest(\n settings: MapLibreProviderSettings,\n azureToken: AzureMapsToken | null,\n url: string,\n): RequestParameters | undefined {\n if (settings.name === 'azureMaps' && url.startsWith(AZURE_MAPS_ENDPOINT)) {\n const headers = azureMapsHeaders(azureToken?.current ?? null);\n return headers ? { url, headers } : undefined;\n }\n if (settings.name === 'esri' && settings.apiKey) {\n const signed = withEsriToken(url, settings.apiKey);\n return signed === url ? undefined : { url: signed };\n }\n return undefined;\n}\n\n// The hints for zooming and panning, as MapLibre names its strings.\nfunction gestureLocale(help: MapGestureHelp): Record<string, string> {\n return {\n 'CooperativeGesturesHandler.WindowsHelpText': help.windows,\n 'CooperativeGesturesHandler.MacHelpText': help.mac,\n 'CooperativeGesturesHandler.MobileHelpText': help.mobile,\n };\n}\n","/// <reference types=\"google.maps\" />\nimport { approximateBounds } from '../geo.js';\nimport { SUGGESTION_COUNT } from '../geocoders.js';\nimport type {\n GoogleSettings,\n MapAddressQuery,\n MapGeocoder,\n MapOverlay,\n MapProvider,\n MapSurface,\n MapSurfaceContext,\n} from '../provider.js';\nimport type {\n MapAddressSuggestion,\n MapBounds,\n MapCamera,\n MapPlace,\n MapPoint,\n MapPosition,\n MapShape,\n MapStyle,\n MapView,\n} from '../types.js';\n\nconst CALLBACK = '__pppGoogleMapsLoaded';\n\n// Google's script, once per page: every map on it shares the first one's key and language. Kept on\n// the global object, as the provider registry is, so every copy of the map's code on the page — a\n// Blazor bundle and a React one — loads it once between them.\nconst SHARED = Symbol.for('powerportalspro.maps.google');\n\ninterface SharedGoogleMaps {\n loading: Promise<void> | null;\n /** The maps to tell when Google refuses the key, which it reports once, for the page. */\n authFailureListeners: Set<() => void>;\n}\n\ntype GoogleGlobal = typeof globalThis & {\n google?: typeof google;\n gm_authFailure?: () => void;\n [CALLBACK]?: () => void;\n [SHARED]?: SharedGoogleMaps;\n};\n\nfunction shared(): SharedGoogleMaps {\n return ((globalThis as GoogleGlobal)[SHARED] ??= { loading: null, authFailureListeners: new Set() });\n}\n\n/** Loads the Maps JavaScript API, once. */\nexport function loadGoogleMaps(apiKey: string, language: string, document: Document): Promise<void> {\n const global = globalThis as GoogleGlobal;\n if (typeof global.google?.maps?.importLibrary === 'function') return Promise.resolve();\n\n const state = shared();\n state.loading ??= new Promise<void>((resolve, reject) => {\n const previousFailure = global.gm_authFailure;\n global.gm_authFailure = () => {\n previousFailure?.();\n for (const listener of state.authFailureListeners) listener();\n };\n global[CALLBACK] = () => resolve();\n\n const query = new URLSearchParams({ key: apiKey, v: 'weekly', loading: 'async', callback: CALLBACK, language });\n const script = document.createElement('script');\n script.src = `https://maps.googleapis.com/maps/api/js?${query}`;\n script.async = true;\n script.onerror = () => {\n state.loading = null;\n script.remove();\n reject(new Error(\"Google Maps' script could not be loaded.\"));\n };\n document.head.appendChild(script);\n });\n return state.loading;\n}\n\nconst MAP_TYPES: Record<MapStyle, string> = { road: 'roadmap', satellite: 'satellite', hybrid: 'hybrid' };\n\nexport const googleProvider: MapProvider<GoogleSettings> = {\n name: 'google',\n async create(context) {\n if (!context.settings.apiKey) throw new Error(\"Google Maps needs the portal's API key: PowerPortalsPro:Maps:Google:ApiKey.\");\n await loadGoogleMaps(context.settings.apiKey, context.language, context.container.ownerDocument);\n const [maps, core] = await Promise.all([\n google.maps.importLibrary('maps') as Promise<google.maps.MapsLibrary>,\n google.maps.importLibrary('core') as Promise<google.maps.CoreLibrary>,\n ]);\n return new GoogleSurface(context, maps, core);\n },\n};\n\ninterface Placed {\n element: HTMLElement;\n position: google.maps.LatLng;\n anchor: 'bottom' | 'center';\n}\n\nclass GoogleSurface implements MapSurface {\n readonly geocoder: MapGeocoder = new GooglePlaces();\n private readonly map: google.maps.Map;\n private readonly layer: google.maps.OverlayView & { placed: Set<Placed>; place(placed: Placed): void };\n private readonly listeners: google.maps.MapsEventListener[] = [];\n private shapes: { shape: google.maps.Polyline | google.maps.Polygon | google.maps.Circle; listener: google.maps.MapsEventListener }[] = [];\n private readonly onAuthFailure: () => void;\n // Where the map was when it last stopped: a draw anywhere else is a move, one there a redraw.\n private idleView: string | null = null;\n private style: MapStyle;\n private readonly dark: boolean;\n\n constructor(\n private readonly context: MapSurfaceContext<GoogleSettings>,\n private readonly maps: google.maps.MapsLibrary,\n private readonly core: google.maps.CoreLibrary,\n ) {\n this.style = context.style;\n this.dark = context.dark;\n\n this.map = new maps.Map(context.container, {\n center: toLatLngLiteral(context.camera.center),\n zoom: context.camera.zoom,\n mapTypeId: MAP_TYPES[context.style],\n // Google's dark scheme can only be chosen as the map is made: the map is made again when the\n // portal's theme changes (setStyle returns false).\n colorScheme: context.dark ? 'DARK' : 'LIGHT',\n ...(context.settings.mapId ? { mapId: context.settings.mapId } : {}),\n // The map's style is the page's to choose, and a place's own card would cover the popup.\n mapTypeControl: false,\n streetViewControl: false,\n fullscreenControl: false,\n clickableIcons: false,\n // Last, so the host's own options win: Street View, its controls, gesture handling.\n ...(context.nativeOptions as google.maps.MapOptions | undefined),\n });\n\n // Google draws its overlays whenever it likes, moving or not, and only a move ends in an idle: a\n // draw where the map last stopped is a redraw, or the map would count as moving until it next\n // moved and stopped.\n this.layer = createElementLayer(maps, () =>\n this.viewKey() === this.idleView ? context.events.redrawn() : context.events.viewChanging(),\n );\n this.layer.setMap(this.map);\n\n const events = context.events;\n this.listeners.push(\n this.map.addListener('click', (event: google.maps.MapMouseEvent) => {\n if (!event.latLng) return;\n const position = fromLatLng(event.latLng);\n events.click(position, this.project(position));\n }),\n this.map.addListener('bounds_changed', () => events.viewChanging()),\n this.map.addListener('idle', () => {\n this.idleView = this.viewKey();\n events.viewChanged();\n }),\n );\n\n this.onAuthFailure = () => events.error('Google Maps refused the API key.');\n shared().authFailureListeners.add(this.onAuthFailure);\n }\n\n get native(): unknown {\n return this.map;\n }\n\n getView(): MapView {\n const center = this.map.getCenter();\n const zoom = this.map.getZoom() ?? this.context.camera.zoom;\n const position = center ? fromLatLng(center) : this.context.camera.center;\n const bounds = this.map.getBounds();\n const container = this.context.container;\n return {\n center: position,\n zoom,\n // Until the map has drawn once, Google has no bounds to give: worked out from the camera.\n bounds: bounds\n ? {\n north: bounds.getNorthEast().lat(),\n east: bounds.getNorthEast().lng(),\n south: bounds.getSouthWest().lat(),\n west: bounds.getSouthWest().lng(),\n }\n : approximateBounds(position, zoom, container.clientWidth, container.clientHeight),\n };\n }\n\n setCamera(camera: MapCamera, animate: boolean): void {\n if (animate) {\n this.map.panTo(toLatLngLiteral(camera.center));\n this.map.setZoom(camera.zoom);\n } else {\n this.map.moveCamera({ center: toLatLngLiteral(camera.center), zoom: camera.zoom });\n }\n }\n\n fitBounds(bounds: MapBounds, padding: number, maxZoom: number): void {\n this.map.fitBounds(\n { north: bounds.north, south: bounds.south, east: bounds.east, west: bounds.west },\n padding,\n );\n // Google's fitBounds has no ceiling: one close cluster of items would zoom in to the street.\n const listener = this.map.addListener('idle', () => {\n listener.remove();\n if ((this.map.getZoom() ?? 0) > maxZoom) this.map.setZoom(maxZoom);\n });\n }\n\n panBy(x: number, y: number): void {\n this.map.panBy(x, y);\n }\n\n // Where the map is looking, to tell a draw where it last stopped from one somewhere else.\n private viewKey(): string {\n const center = this.map.getCenter();\n return `${center?.lat()},${center?.lng()},${this.map.getZoom()}`;\n }\n\n project(position: MapPosition): MapPoint {\n const point = this.layer\n .getProjection()\n ?.fromLatLngToContainerPixel(new this.core.LatLng(position.latitude, position.longitude));\n if (point) return { x: point.x, y: point.y };\n\n // Before the map has drawn: the container's center is as good as any.\n return { x: this.context.container.clientWidth / 2, y: this.context.container.clientHeight / 2 };\n }\n\n addOverlay(element: HTMLElement, position: MapPosition, anchor: 'bottom' | 'center'): MapOverlay {\n const placed: Placed = { element, anchor, position: new this.core.LatLng(position.latitude, position.longitude) };\n element.style.position = 'absolute';\n element.style.transform = anchor === 'bottom' ? 'translate(-50%, -100%)' : 'translate(-50%, -50%)';\n // Clicks and drags on the element are the element's, not the map's.\n this.maps.OverlayView.preventMapHitsAndGesturesFrom(element);\n this.layer.placed.add(placed);\n this.layer.place(placed);\n\n return {\n setPosition: (next) => {\n placed.position = new this.core.LatLng(next.latitude, next.longitude);\n this.layer.place(placed);\n },\n remove: () => {\n this.layer.placed.delete(placed);\n element.remove();\n },\n };\n }\n\n setShapes(shapes: readonly MapShape[]): void {\n for (const { shape, listener } of this.shapes) {\n listener.remove();\n shape.setMap(null);\n }\n\n this.shapes = shapes.map((item) => {\n const stroke = { strokeColor: item.color ?? '', strokeOpacity: 1, map: this.map, clickable: true };\n const area = { ...stroke, strokeWeight: 2, fillColor: item.color ?? '', fillOpacity: 0.2 };\n const shape =\n item.kind === 'polyline'\n ? new this.maps.Polyline({ ...stroke, strokeWeight: item.width ?? 3, path: item.path.map(toLatLngLiteral) })\n : item.kind === 'polygon'\n ? new this.maps.Polygon({ ...area, paths: item.path.map(toLatLngLiteral) })\n : new this.maps.Circle({ ...area, center: toLatLngLiteral(item.center), radius: item.radius });\n\n const listener = shape.addListener('click', (event: google.maps.MapMouseEvent) => {\n if (!event.latLng) return;\n const position = fromLatLng(event.latLng);\n this.context.events.shapeClick(item.id, position, this.project(position));\n });\n return { shape, listener };\n });\n }\n\n setStyle(style: MapStyle, dark: boolean): boolean {\n if (dark !== this.dark) return false;\n if (style !== this.style) {\n this.style = style;\n this.map.setMapTypeId(MAP_TYPES[style]);\n }\n return true;\n }\n\n resize(): void {\n // Google watches its container's size itself.\n }\n\n dispose(): void {\n shared().authFailureListeners.delete(this.onAuthFailure);\n for (const listener of this.listeners) listener.remove();\n this.setShapes([]);\n this.layer.setMap(null);\n google.maps.event.clearInstanceListeners(this.map);\n this.context.container.replaceChildren();\n }\n}\n\n/**\n * Google's Places autocomplete, which the key needs the Places API (New) enabled for. A search's\n * suggestions and the place chosen from them share a session, which Google bills as one.\n */\n/** Google's Places, for finding a place without a map: its script is loaded first. */\nexport async function googlePlaceFinder(apiKey: string, language: string, document: Document): Promise<MapGeocoder> {\n await loadGoogleMaps(apiKey, language, document);\n return new GooglePlaces();\n}\n\nclass GooglePlaces implements MapGeocoder {\n readonly suggestsAsYouType = true;\n private session: google.maps.places.AutocompleteSessionToken | null = null;\n private readonly predictions = new Map<string, google.maps.places.PlacePrediction>();\n\n async suggest({ text, view, countries, language }: MapAddressQuery): Promise<MapAddressSuggestion[]> {\n const places = (await google.maps.importLibrary('places')) as google.maps.PlacesLibrary;\n this.session ??= new places.AutocompleteSessionToken();\n const { suggestions } = await places.AutocompleteSuggestion.fetchAutocompleteSuggestions({\n input: text,\n sessionToken: this.session,\n language,\n locationBias: { ...view.bounds },\n // Google takes 15 at most.\n ...(countries.length ? { includedRegionCodes: countries.slice(0, 15).map((country) => country.toLowerCase()) } : {}),\n });\n\n if (this.predictions.size > 50) this.predictions.clear();\n return suggestions.slice(0, SUGGESTION_COUNT).flatMap(({ placePrediction: prediction }) => {\n if (!prediction) return [];\n this.predictions.set(prediction.placeId, prediction);\n const detail = prediction.secondaryText?.text;\n return [{ id: prediction.placeId, text: prediction.mainText?.text ?? prediction.text.text, ...(detail ? { detail } : {}) }];\n });\n }\n\n async resolve(suggestion: MapAddressSuggestion): Promise<MapPlace | null> {\n const prediction = this.predictions.get(suggestion.id);\n if (!prediction) return null;\n const place = prediction.toPlace();\n // The session ends with the place it found.\n this.session = null;\n await place.fetchFields({ fields: ['displayName', 'formattedAddress', 'location', 'viewport'] });\n if (!place.location) return null;\n\n const viewport = place.viewport;\n const label = place.formattedAddress ?? place.displayName ?? suggestion.text;\n return {\n label: place.displayName && label && !label.startsWith(place.displayName) ? `${place.displayName}, ${label}` : label,\n position: fromLatLng(place.location),\n ...(viewport\n ? {\n bounds: {\n north: viewport.getNorthEast().lat(),\n east: viewport.getNorthEast().lng(),\n south: viewport.getSouthWest().lat(),\n west: viewport.getSouthWest().lng(),\n },\n }\n : {}),\n };\n }\n}\n\n// The overlay the map's elements sit in: one element of Google's panes, each child kept at its\n// position as Google draws. The class exists only once Google's script has loaded.\nfunction createElementLayer(maps: google.maps.MapsLibrary, onDraw: () => void) {\n class ElementLayer extends maps.OverlayView {\n readonly placed = new Set<Placed>();\n private readonly root = document.createElement('div');\n\n override onAdd(): void {\n this.getPanes()?.overlayMouseTarget.appendChild(this.root);\n for (const placed of this.placed) this.root.appendChild(placed.element);\n }\n\n override draw(): void {\n for (const placed of this.placed) this.place(placed);\n onDraw();\n }\n\n override onRemove(): void {\n this.root.remove();\n }\n\n place(placed: Placed): void {\n if (placed.element.parentElement !== this.root) this.root.appendChild(placed.element);\n const point = this.getProjection()?.fromLatLngToDivPixel(placed.position);\n if (!point) return;\n placed.element.style.left = `${point.x}px`;\n placed.element.style.top = `${point.y}px`;\n }\n }\n return new ElementLayer();\n}\n\nfunction toLatLngLiteral(position: MapPosition): google.maps.LatLngLiteral {\n return { lat: position.latitude, lng: position.longitude };\n}\n\nfunction fromLatLng(latLng: google.maps.LatLng): MapPosition {\n return { latitude: latLng.lat(), longitude: latLng.lng() };\n}\n","import type { MapProvider, MapProviderSettings } from './provider.js';\n\n// Kept on the global object under a registry symbol rather than in this module, so a provider a\n// host registers reaches every copy of the map's code on the page: a Blazor portal's bundle and a\n// script of the host's each load their own.\nconst REGISTRY = Symbol.for('powerportalspro.maps.providers');\n\ntype Registry = Map<string, MapProvider<never>>;\n\nfunction registry(): Registry {\n const global = globalThis as unknown as Record<symbol, Registry | undefined>;\n return (global[REGISTRY] ??= new Map());\n}\n\n/**\n * Adds a map provider, or replaces one of the same name — a built-in one included. A map whose\n * provider settings name it draws with it.\n */\nexport function registerMapProvider<TSettings extends MapProviderSettings>(provider: MapProvider<TSettings>): void {\n registry().set(provider.name, provider as MapProvider<never>);\n}\n\n// The built-in providers, each loaded with its library only when a map first uses it: MapLibre is a\n// megabyte a page showing Google's map never needs, and Google's script the reverse.\nconst BUILT_IN: Record<string, () => Promise<MapProvider<never>>> = {\n azureMaps: () => import(/* webpackChunkName: \"maplibre\" */ './providers/maplibre.js').then((module) => module.mapLibreProvider('azureMaps')),\n esri: () => import(/* webpackChunkName: \"maplibre\" */ './providers/maplibre.js').then((module) => module.mapLibreProvider('esri')),\n openStreetMap: () => import(/* webpackChunkName: \"maplibre\" */ './providers/maplibre.js').then((module) => module.mapLibreProvider('openStreetMap')),\n mapLibre: () => import(/* webpackChunkName: \"maplibre\" */ './providers/maplibre.js').then((module) => module.mapLibreProvider('mapLibre')),\n google: () => import(/* webpackChunkName: \"google\" */ './providers/google.js').then((module) => module.googleProvider),\n};\n\n/** The provider of that name: a registered one first, then a built-in one. Undefined for neither. */\nexport async function findMapProvider(name: string): Promise<MapProvider<never> | undefined> {\n const registered = registry().get(name);\n if (registered) return registered;\n\n const load = BUILT_IN[name];\n return load ? await load() : undefined;\n}\n\n/** The names of the built-in providers. */\nexport const BUILT_IN_MAP_PROVIDERS = Object.freeze(Object.keys(BUILT_IN));\n","import type { AzureMapsAccessToken, MapProviderKeys, MapProviderSettings } from './provider.js';\nimport { BUILT_IN_MAP_PROVIDERS } from './registry.js';\n\n/**\n * A provider's settings from the portal's `PowerPortalsPro:Maps` configuration, as its\n * `GET /api/maps/settings` answers: by the names the provider reads, unset ones null or missing.\n */\nexport interface PortalMapSettings {\n /** The provider: the one asked for, or the portal's own when none was. */\n provider: string;\n apiKey?: string | null;\n /** Azure Maps' token, issued to the portal's identity. */\n token?: AzureMapsAccessToken | null;\n [setting: string]: unknown;\n}\n\n/** Asks the portal for a provider's settings, or with no name for its own provider's. */\nexport type PortalMapSettingsLoader = (provider: string | undefined) => Promise<PortalMapSettings>;\n\n/** How long before an Azure Maps token expires that it is asked for again. */\nconst TOKEN_RENEWAL_LEAD = 5 * 60_000;\n\n/**\n * The portal's settings for each provider, asked for once a page and shared by its maps — the same\n * for every one of them — and asked for again once an Azure Maps token is within five minutes of\n * expiring. A failure isn't kept: the next map, or the renewal, asks again.\n */\nexport class PortalMapSettingsCache {\n private readonly entries = new Map<string, { settings: Promise<PortalMapSettings>; renewAfter: number }>();\n\n /** The settings for `provider`, or the portal's own provider's, from `load` when none are held. */\n get(provider: string | undefined, load: PortalMapSettingsLoader): Promise<PortalMapSettings> {\n const key = provider ?? '';\n const held = this.entries.get(key);\n if (held && Date.now() < held.renewAfter) return held.settings;\n\n const settings = load(provider);\n const entry = { settings, renewAfter: Number.POSITIVE_INFINITY };\n this.entries.set(key, entry);\n settings.then(\n (answer) => {\n if (answer.token) entry.renewAfter = Date.parse(answer.token.expiresOn) - TOKEN_RENEWAL_LEAD;\n // The portal's own provider is held under its name too, for the maps that name it.\n if (provider === undefined && !this.entries.has(answer.provider)) this.entries.set(answer.provider, entry);\n },\n () => {\n for (const [name, held] of this.entries) if (held === entry) this.entries.delete(name);\n },\n );\n return settings;\n }\n}\n\n/**\n * The settings a map draws with: the page's over the portal's, with the portal's keys. A provider of\n * the page's own isn't the portal's to set up, and without a loader the page's are used as they are.\n */\nexport async function resolveProviderSettings(\n page: MapProviderSettings | undefined,\n load: PortalMapSettingsLoader | undefined,\n): Promise<MapProviderSettings & MapProviderKeys> {\n // A built-in provider by the name its code knows it, however the page cased it — as the portal\n // reads its own setting; a provider of the page's own by the name it was registered under.\n const asked = page?.name;\n const name = asked === undefined ? undefined : BUILT_IN_MAP_PROVIDERS.find((p) => p.toLowerCase() === asked.toLowerCase()) ?? asked;\n if (!load || (name !== undefined && !BUILT_IN_MAP_PROVIDERS.includes(name))) return page && name ? { ...page, name } : { name: 'openStreetMap' };\n\n const { provider, token, apiKey, ...portal } = await load(name);\n const settings: MapProviderSettings & MapProviderKeys = { ...defined(portal), ...defined(page ?? {}), name: name ?? provider };\n if (apiKey) settings.apiKey = apiKey;\n if (token) {\n const providerName = settings.name;\n // The first token is the one just read; each after it is asked of the portal as it comes due.\n settings.getToken = async () => {\n const answer = await load(providerName);\n if (!answer.token) throw new Error(\"The portal didn't issue an Azure Maps token.\");\n return answer.token;\n };\n }\n return settings;\n}\n\n// The settings that are set: the portal sends null for those it has none of, and a page undefined.\nfunction defined(values: object): Record<string, unknown> {\n return Object.fromEntries(Object.entries(values).filter(([, value]) => value !== null && value !== undefined));\n}\n","import type { MapAddressSuggestion } from './types.js';\n\n/** The address search's words, in the viewer's language. */\nexport interface AddressSearchLabels {\n /** The box's placeholder and accessible name: \"Search for an address\". */\n placeholder: string;\n /** The clear button's name. */\n clear: string;\n /** Shown while a search the viewer asked for runs. */\n searching: string;\n /** Shown when nothing is found. */\n noResults: string;\n /** Shown when the provider's search fails. */\n failed: string;\n}\n\n/** What the box asks of the map it searches. */\nexport interface AddressSearchHost {\n /** Whether the map's geocoder suggests places as the viewer types, or only once they press Enter. */\n suggestsAsYouType(): boolean;\n suggest(text: string, signal: AbortSignal): Promise<MapAddressSuggestion[]>;\n /** Goes to the place chosen. False when it can no longer be found. */\n choose(suggestion: MapAddressSuggestion): Promise<boolean>;\n /** The search was cleared. */\n clear(): void;\n}\n\n/** How many characters are typed before places are suggested. */\nexport const MIN_SUGGEST_LENGTH = 3;\n\n/** How long typing pauses before places are suggested, in milliseconds. */\nexport const SUGGEST_DELAY = 250;\n\nconst SEARCH_ICON =\n '<svg viewBox=\"0 0 20 20\" width=\"20\" height=\"20\" aria-hidden=\"true\" focusable=\"false\"><path fill=\"currentColor\" ' +\n 'd=\"M8.5 3a5.5 5.5 0 0 1 4.23 9.02l4.12 4.13a.5.5 0 0 1-.63.76l-.07-.06-4.13-4.12A5.5 5.5 0 1 1 8.5 3Zm0 1a4.5 4.5 0 1 0 0 9 4.5 4.5 0 0 0 0-9Z\"/></svg>';\nconst DISMISS_ICON =\n '<svg viewBox=\"0 0 16 16\" width=\"16\" height=\"16\" aria-hidden=\"true\" focusable=\"false\"><path fill=\"currentColor\" ' +\n 'd=\"m2.59 2.72.06-.07a.5.5 0 0 1 .63-.06l.07.06L8 7.29l4.65-4.64a.5.5 0 0 1 .7.7L8.71 8l4.64 4.65c.18.17.2.44.06.63l-.06.07a.5.5 0 0 1-.63.06l-.07-.06L8 8.71l-4.65 4.64a.5.5 0 0 1-.7-.7L7.29 8 2.65 3.35a.5.5 0 0 1-.06-.63l.06-.07-.06.07Z\"/></svg>';\n\nlet nextId = 0;\n\n/**\n * The map's address search: a text box over its corner, with the places found for what is typed\n * listed under it, as a combobox. Drawn by the map itself, as its pins are, so it searches in the\n * browser on every provider and behaves the same in React and Blazor.\n */\nexport class AddressSearchBox {\n readonly element: HTMLElement;\n private readonly input: HTMLInputElement;\n private readonly clearButton: HTMLButtonElement;\n private readonly panel: HTMLElement;\n private readonly list: HTMLElement;\n private readonly status: HTMLElement;\n private readonly listId = `ppp-map-search-${++nextId}`;\n\n private suggestions: MapAddressSuggestion[] = [];\n // The text the suggestions are for: Enter on it goes to the first, rather than searching again.\n private suggestedFor: string | null = null;\n private active = -1;\n private request: AbortController | null = null;\n private timer: ReturnType<typeof setTimeout> | undefined;\n private disposed = false;\n\n constructor(\n document: Document,\n private readonly host: AddressSearchHost,\n private labels: AddressSearchLabels,\n ) {\n this.element = document.createElement('div');\n this.element.className = 'ppp-map-search';\n\n const field = document.createElement('div');\n field.className = 'ppp-map-search-field';\n const icon = document.createElement('span');\n icon.className = 'ppp-map-search-icon';\n icon.innerHTML = SEARCH_ICON;\n\n this.input = document.createElement('input');\n this.input.type = 'text';\n this.input.className = 'ppp-map-search-input';\n this.input.autocomplete = 'off';\n this.input.spellcheck = false;\n this.input.setAttribute('role', 'combobox');\n this.input.setAttribute('aria-autocomplete', 'list');\n this.input.setAttribute('aria-expanded', 'false');\n this.input.setAttribute('aria-controls', this.listId);\n\n this.clearButton = document.createElement('button');\n this.clearButton.type = 'button';\n this.clearButton.className = 'ppp-map-search-clear';\n this.clearButton.innerHTML = DISMISS_ICON;\n this.clearButton.hidden = true;\n\n field.append(icon, this.input, this.clearButton);\n\n this.panel = document.createElement('div');\n this.panel.className = 'ppp-map-search-panel';\n this.panel.hidden = true;\n this.list = document.createElement('ul');\n this.list.className = 'ppp-map-search-list';\n this.list.id = this.listId;\n this.list.setAttribute('role', 'listbox');\n this.status = document.createElement('div');\n this.status.className = 'ppp-map-search-status';\n this.status.setAttribute('role', 'status');\n this.panel.append(this.list, this.status);\n\n this.element.append(field, this.panel);\n this.setLabels(labels);\n\n this.input.addEventListener('input', () => this.typed());\n this.input.addEventListener('keydown', (event) => this.keyDown(event));\n this.input.addEventListener('focus', () => {\n if (this.suggestions.length && this.suggestedFor === this.text) this.open();\n });\n this.element.addEventListener('focusout', (event) => {\n if (!this.element.contains(event.relatedTarget as Node | null)) this.close();\n });\n this.clearButton.addEventListener('click', () => {\n this.clear();\n this.input.focus();\n });\n // A press on a suggestion keeps the focus in the box, so it isn't closed before the click.\n this.list.addEventListener('mousedown', (event) => event.preventDefault());\n this.list.addEventListener('click', (event) => {\n const option = (event.target as Element).closest('[role=\"option\"]');\n const index = option ? Number(option.getAttribute('data-index')) : -1;\n if (index >= 0) void this.choose(index);\n });\n }\n\n /** The text in the box. */\n get text(): string {\n return this.input.value.trim();\n }\n\n setLabels(labels: AddressSearchLabels): void {\n this.labels = labels;\n this.input.placeholder = labels.placeholder;\n this.input.setAttribute('aria-label', labels.placeholder);\n this.list.setAttribute('aria-label', labels.placeholder);\n this.clearButton.setAttribute('aria-label', labels.clear);\n // Shown by the page's Fluent tooltip (React: the map's own), not the browser's.\n this.clearButton.dataset.pppTooltip = labels.clear;\n }\n\n /**\n * Shows a place the map went to from code, as though it had been chosen here: its label in the box,\n * which Enter goes back to and the clear button takes off the map.\n */\n showChosen(label: string): void {\n this.cancel();\n this.input.value = label;\n this.clearButton.hidden = false;\n this.suggestions = [];\n this.suggestedFor = null;\n this.close();\n }\n\n /** Forgets the places listed, which a geocoder that replaced the one that found them can't go to. */\n forgetSuggestions(): void {\n this.cancel();\n this.suggestions = [];\n this.suggestedFor = null;\n this.close();\n }\n\n /** Empties the box and takes the place found off the map. */\n clear(): void {\n this.cancel();\n this.input.value = '';\n this.clearButton.hidden = true;\n this.suggestions = [];\n this.suggestedFor = null;\n this.close();\n this.host.clear();\n }\n\n dispose(): void {\n this.disposed = true;\n this.cancel();\n this.element.remove();\n }\n\n private typed(): void {\n this.clearButton.hidden = !this.input.value;\n this.cancel();\n this.active = -1;\n if (!this.host.suggestsAsYouType() || this.text.length < MIN_SUGGEST_LENGTH) {\n // What was found was for other text.\n this.suggestions = [];\n this.suggestedFor = null;\n this.close();\n return;\n }\n const text = this.text;\n this.timer = setTimeout(() => void this.run(text, false), SUGGEST_DELAY);\n }\n\n private keyDown(event: KeyboardEvent): void {\n const count = this.suggestions.length;\n switch (event.key) {\n case 'ArrowDown':\n if (!count) return;\n event.preventDefault();\n this.open();\n this.setActive((this.active + 1) % count);\n break;\n case 'ArrowUp':\n if (!count) return;\n event.preventDefault();\n this.open();\n this.setActive(this.active <= 0 ? count - 1 : this.active - 1);\n break;\n case 'Enter':\n event.preventDefault();\n if (!this.panel.hidden && this.active >= 0) void this.choose(this.active);\n else void this.submit();\n break;\n case 'Escape':\n // Taken here, so the map's popup, or a dialog the map is in, doesn't close with it.\n if (!this.panel.hidden) {\n event.preventDefault();\n event.stopPropagation();\n this.close();\n } else if (this.input.value) {\n event.preventDefault();\n event.stopPropagation();\n this.clear();\n }\n break;\n }\n }\n\n // Enter with no suggestion picked: the first place found for the text, searched for if it hasn't been.\n private async submit(): Promise<boolean> {\n const text = this.text;\n if (!text) return false;\n this.cancel();\n const found = this.suggestedFor === text && this.suggestions.length ? this.suggestions : await this.run(text, true);\n if (!found?.length) return false;\n return this.choose(0);\n }\n\n // The places for `text`: listed as they come, or, asked for with Enter, with a note while they come.\n private async run(text: string, submitted: boolean): Promise<MapAddressSuggestion[] | null> {\n this.cancel();\n const request = new AbortController();\n this.request = request;\n if (submitted) this.showStatus(this.labels.searching);\n\n let found: MapAddressSuggestion[];\n try {\n found = await this.host.suggest(text, request.signal);\n } catch (error) {\n if (request.signal.aborted || this.disposed) return null;\n this.suggestions = [];\n this.suggestedFor = null;\n this.renderList();\n this.showStatus(this.labels.failed);\n console.warn(\"The map's address search failed.\", error);\n return null;\n }\n if (request.signal.aborted || this.disposed) return null;\n this.request = null;\n\n this.suggestions = found;\n this.suggestedFor = text;\n this.active = -1;\n this.renderList();\n if (found.length) {\n this.status.textContent = '';\n // Enter goes straight to the first place, rather than listing them first.\n if (!submitted) this.open();\n } else {\n this.showStatus(this.labels.noResults);\n }\n return found;\n }\n\n private async choose(index: number): Promise<boolean> {\n const suggestion = this.suggestions[index];\n if (!suggestion) return false;\n this.cancel();\n this.input.value = suggestion.detail ? `${suggestion.text}, ${suggestion.detail}` : suggestion.text;\n this.clearButton.hidden = false;\n // Enter in the box goes back to the place it shows, not to the list's first.\n this.suggestions = [suggestion];\n this.suggestedFor = this.text;\n this.close();\n\n try {\n if (await this.host.choose(suggestion)) return true;\n if (!this.disposed) this.showStatus(this.labels.noResults);\n } catch (error) {\n if (this.disposed) return false;\n this.showStatus(this.labels.failed);\n console.warn(\"The map's address search couldn't find the place chosen.\", error);\n }\n return false;\n }\n\n private cancel(): void {\n clearTimeout(this.timer);\n this.request?.abort();\n this.request = null;\n }\n\n private renderList(): void {\n const document = this.element.ownerDocument;\n this.list.replaceChildren(\n ...this.suggestions.map((suggestion, index) => {\n const option = document.createElement('li');\n option.id = `${this.listId}-${index}`;\n option.className = 'ppp-map-search-option';\n option.setAttribute('role', 'option');\n option.setAttribute('aria-selected', 'false');\n option.setAttribute('data-index', `${index}`);\n const text = document.createElement('span');\n text.className = 'ppp-map-search-text';\n text.textContent = suggestion.text;\n option.append(text);\n if (suggestion.detail) {\n const detail = document.createElement('span');\n detail.className = 'ppp-map-search-detail';\n detail.textContent = suggestion.detail;\n option.append(detail);\n }\n return option;\n }),\n );\n this.list.hidden = this.suggestions.length === 0;\n this.setActive(-1);\n }\n\n private setActive(index: number): void {\n this.active = index;\n this.list.querySelectorAll('[role=\"option\"]').forEach((option, i) => {\n option.setAttribute('aria-selected', `${i === index}`);\n option.toggleAttribute('data-active', i === index);\n });\n if (index >= 0) {\n this.input.setAttribute('aria-activedescendant', `${this.listId}-${index}`);\n this.list.children[index]?.scrollIntoView?.({ block: 'nearest' });\n } else {\n this.input.removeAttribute('aria-activedescendant');\n }\n }\n\n private showStatus(text: string): void {\n this.status.textContent = text;\n this.status.hidden = false;\n this.list.hidden = true;\n this.panel.hidden = false;\n this.input.setAttribute('aria-expanded', 'false');\n }\n\n private open(): void {\n if (!this.suggestions.length) return;\n this.list.hidden = false;\n this.status.textContent = '';\n this.status.hidden = true;\n this.panel.hidden = false;\n this.input.setAttribute('aria-expanded', 'true');\n }\n\n private close(): void {\n this.panel.hidden = true;\n this.status.textContent = '';\n this.input.setAttribute('aria-expanded', 'false');\n this.setActive(-1);\n }\n}\n","import { AddressSearchBox, type AddressSearchLabels } from './address-search.js';\nimport { approximateBounds, boundsOfItems, isValidPosition } from './geo.js';\nimport { MarkerLayer, PIN_SVG } from './markers.js';\nimport { readPopupContent } from './popup-content.js';\nimport { snapshotElement, type SnapshotFrame } from './popup-snapshot.js';\nimport { resolveProviderSettings, type PortalMapSettingsLoader } from './portal-settings.js';\nimport { canvasBlob, drawMapImage, printImage, printPage, saveCanvas, type MapImageParts, type MapPrintSheet } from './print.js';\nimport type { MapGeocoder, MapGestureHelp, MapOverlay, MapProviderSettings, MapSurface, MapSurfaceEvents } from './provider.js';\nimport { findMapProvider } from './registry.js';\nimport { ensureMapStyles } from './styles.js';\nimport { DEFAULT_ITEM_COLOR, isDarkTheme, resolveColor, watchTheme } from './theme.js';\nimport type {\n MapAddressSuggestion,\n MapCamera,\n MapClickEvent,\n MapItem,\n MapItemClickEvent,\n MapLegendEntry,\n MapMarker,\n MapPlace,\n MapPosition,\n MapPrintOptions,\n MapPrintPopup,\n MapShape,\n MapStyle,\n MapView,\n} from './types.js';\n\n/** Where a map with no camera and nothing to fit looks: the whole world. */\nexport const WORLD_CAMERA: MapCamera = { center: { latitude: 20, longitude: 0 }, zoom: 1.5 };\n\n/** How far a map fitted to its items zooms in at most: on one item, a few streets around it. */\nexport const FIT_MAX_ZOOM = 15;\n\n/** Space kept around items fitted into view, in CSS pixels: room for a pin above its point. */\nexport const FIT_PADDING = 48;\n\n/** How far the map zooms in on a place found that has no area of its own: a street's buildings. */\nexport const PLACE_ZOOM = 16;\n\n/** How far the map zooms in at most to fit a place found's area. */\nconst PLACE_MAX_ZOOM = 17;\n\n/** How sharp the map's image is drawn, in device pixels to a CSS pixel, at least: enough for paper. */\nconst IMAGE_PIXEL_RATIO = 2;\n\n/** The longest side of the map's image, in device pixels: more than a printer needs, less than a browser's limit. */\nconst IMAGE_MAX_SIZE = 4096;\n\n/** The pin of a place the address search found, as the stylesheet colors it. */\nconst PLACE_COLOR = 'var(--colorPaletteRedBackground3, #d13438)';\n\n/** How far above a marker's point its popup sits: the pin's height and a little more. */\nconst MARKER_POPUP_OFFSET = 38;\nconst SHAPE_POPUP_OFFSET = 8;\n\n/** The map's error kinds, for the host to put in words. */\nexport type MapErrorKind = 'unknown-provider' | 'failed';\n\nexport interface MapControllerOptions {\n /** Which provider draws the map, and how it looks. The portal's own provider when unset. */\n provider?: MapProviderSettings | undefined;\n /**\n * Asks the portal for a provider's settings — its keys among them — or with no name for its own\n * provider's. Without it the page's settings are used as they are, OpenStreetMap's when unset.\n */\n portalSettings?: PortalMapSettingsLoader | undefined;\n style: MapStyle;\n /** Where to look first. Fitted to the items when unset, the whole world without any. */\n camera?: MapCamera | undefined;\n /** Gather pins close together into clusters. */\n cluster: boolean;\n /** Draw the dark base map, where the provider has one, when the portal's theme is dark. */\n usePortalTheme: boolean;\n /** The viewer's language, as a culture name such as `en-US`. */\n language: string;\n nativeOptions?: Record<string, unknown> | undefined;\n /** A cluster's accessible name for its count, such as \"12 items\". */\n clusterLabel: (count: number) => string;\n /** The hints for zooming with a modifier key and panning with two fingers. */\n gestureHelp?: MapGestureHelp | undefined;\n /**\n * A box over the map's corner for finding an address with the provider's own search, in the\n * viewer's language; none when unset, or when the provider has no search.\n */\n addressSearch?: AddressSearchOptions | null | undefined;\n /**\n * An address to show: found with the provider's search once the map is drawn, and again whenever\n * it changes, then pinned and brought into view as a place the address search finds is. How the\n * search goes is reported through `events.addressStatus`.\n */\n address?: string | undefined;\n}\n\n/** How finding the address the options name goes: searching, then found, not found or failed. */\nexport type MapAddressStatus = 'searching' | 'found' | 'not-found' | 'failed';\n\n/** The address search's words, and where it looks. */\nexport interface AddressSearchOptions extends AddressSearchLabels {\n /** ISO 3166-1 two-letter codes of the countries it finds places in; anywhere when empty. */\n countries?: readonly string[] | undefined;\n}\n\nexport interface MapControllerEvents {\n mapClick?(event: MapClickEvent): void;\n itemClick?(event: MapItemClickEvent): void;\n /** Pins at one place, clicked as a cluster: the map can't zoom them apart. */\n clusterClick?(event: { ids: string[]; position: MapPosition }): void;\n /** The view has settled after a move. */\n viewChanged?(view: MapView): void;\n /** The address search went to a place, or, with null, was cleared. */\n addressSelected?(place: MapPlace | null): void;\n /** How finding the address the options name goes. */\n addressStatus?(status: MapAddressStatus): void;\n error?(kind: MapErrorKind, message: string): void;\n}\n\ninterface Popup {\n element: HTMLElement;\n position: MapPosition;\n offset: number;\n}\n\n/**\n * One map: the provider's surface, the markers and clusters over it, its shapes, and the popup the\n * host renders. What a React component or a Blazor component's script drives; it knows nothing of\n * either.\n */\nexport class MapController {\n private surface: MapSurface | null = null;\n private markers: MarkerLayer | null = null;\n private items: MapItem[] = [];\n private shapes: MapShape[] = [];\n private popup: Popup | null = null;\n private dark = false;\n private disposed = false;\n // A fit asked for while the map had no size — drawn in a tab not yet shown — made when it gets one.\n private fitPending = false;\n private fitPendingIds: readonly string[] | undefined;\n // Counts draws, so one overtaken by another — the theme flipping again while Google's map is\n // being made again — throws its map away rather than leaving two.\n private drawGeneration = 0;\n // The shapes and their colors as last handed to the surface: a theme check that changed neither\n // costs nothing.\n private drawnShapes: { shapes: MapShape[]; colors: string } | null = null;\n private readonly stopWatching: () => void;\n private readonly resizeObserver: ResizeObserver | null;\n // The open popup's size: content that comes after it opens — figures replacing a spinner — can\n // grow it past the map's edge, so it is kept in view again whenever it changes.\n private readonly popupObserver: ResizeObserver | null;\n // Whether the map is moving — a pan keeping the popup in view among others — and whether the popup\n // is to be checked again once it stops: measured mid-move, it would be panned for twice over.\n private moving = false;\n private keepInViewPending = false;\n private search: AddressSearchBox | null = null;\n // The geocoder the box's suggestions came from: one drawn in its place can't go to them.\n private searchGeocoder: MapGeocoder | null = null;\n // The place the address search went to, pinned until the search is cleared — or the place of the\n // address the options name, until they name none.\n private place: { place: MapPlace; overlay: MapOverlay | null; fromAddress: boolean } | null = null;\n // Finding the address the options name; given up when it changes.\n private addressRequest: AbortController | null = null;\n // Where the address the options name was found: pinned again once a search's place in its stead\n // is cleared.\n private addressPlace: MapPlace | null = null;\n\n private constructor(\n private readonly container: HTMLElement,\n private readonly surfaceElement: HTMLElement,\n private options: MapControllerOptions,\n private readonly events: MapControllerEvents,\n ) {\n this.dark = options.usePortalTheme && isDarkTheme(container);\n this.stopWatching = watchTheme(container, () => this.themeChanged());\n this.resizeObserver =\n typeof ResizeObserver === 'undefined' ? null : new ResizeObserver(() => this.resized());\n this.resizeObserver?.observe(container);\n this.popupObserver = typeof ResizeObserver === 'undefined' ? null : new ResizeObserver(() => this.requestKeepInView());\n }\n\n /**\n * Draws a map into `container`, which it fills: an element of the host's, positioned and sized.\n * Resolves once the provider's map is up; a provider that fails reports through `events.error`\n * and leaves the container empty.\n */\n static async create(\n container: HTMLElement,\n options: MapControllerOptions,\n items: readonly MapItem[],\n events: MapControllerEvents,\n ): Promise<MapController> {\n ensureMapStyles(container.ownerDocument);\n\n const surfaceElement = container.ownerDocument.createElement('div');\n surfaceElement.className = 'ppp-map-surface';\n container.prepend(surfaceElement);\n\n const controller = new MapController(container, surfaceElement, options, events);\n controller.items = [...items];\n await controller.draw(options.camera ?? null);\n // Found once the map is up, which comes first: the page's spinner says it is still looking.\n void controller.showAddress(false);\n return controller;\n }\n\n /** The provider's own map object, once drawn. */\n get native(): unknown {\n return this.surface?.native ?? null;\n }\n\n /** Replaces the items. `fit` moves the view to show them all. */\n setItems(items: readonly MapItem[], fit: boolean): void {\n this.items = [...items];\n this.applyItems();\n if (fit) this.fitToItems();\n }\n\n /** Applies changed options. A new provider draws the map again; anything else changes it in place. */\n async setOptions(options: MapControllerOptions): Promise<void> {\n const previous = this.options;\n this.options = options;\n const addressChanged = (previous.address?.trim() ?? '') !== (options.address?.trim() ?? '');\n\n if (JSON.stringify(previous.provider ?? null) !== JSON.stringify(options.provider ?? null) ||\n JSON.stringify(previous.nativeOptions ?? null) !== JSON.stringify(options.nativeOptions ?? null) ||\n previous.language !== options.language) {\n // A search under way asked the provider's map being taken down: given up, and asked again of\n // the new one.\n const searching = this.addressRequest !== null;\n this.addressRequest?.abort();\n this.addressRequest = null;\n await this.redraw();\n if (addressChanged || searching) void this.showAddress(true);\n return;\n }\n\n if (addressChanged) void this.showAddress(true);\n\n if (previous.cluster !== options.cluster) this.applyItems();\n this.applySearch();\n // Its words, which can come after the map is drawn, as the strings load.\n if (options.gestureHelp && JSON.stringify(previous.gestureHelp ?? null) !== JSON.stringify(options.gestureHelp)) {\n this.surface?.setGestureHelp?.(options.gestureHelp);\n }\n\n const dark = options.usePortalTheme && isDarkTheme(this.container);\n if (previous.style !== options.style || dark !== this.dark) {\n this.dark = dark;\n if (this.surface && !this.surface.setStyle(options.style, dark)) await this.redraw();\n }\n }\n\n getView(): MapView | null {\n return this.surface?.getView() ?? null;\n }\n\n setCamera(camera: MapCamera, animate = true): void {\n this.fitPending = false;\n this.surface?.setCamera(camera, animate);\n }\n\n /**\n * Moves the view to show every item — or, given `ids` (not empty), the items of those ids — or to\n * the whole world without any.\n */\n fitToItems(ids?: readonly string[]): void {\n if (!this.surface) return;\n // Bounds can't be fitted into an element of no size: fitted once it has one.\n if (!this.container.clientWidth || !this.container.clientHeight) {\n this.fitPending = true;\n this.fitPendingIds = ids;\n return;\n }\n this.fitPending = false;\n this.fitPendingIds = undefined;\n const wanted = ids?.length ? new Set(ids) : null;\n const bounds = boundsOfItems(wanted ? this.items.filter((item) => wanted.has(item.id)) : this.items);\n if (!bounds) {\n this.surface.setCamera(WORLD_CAMERA, false);\n } else if (bounds.north === bounds.south && bounds.east === bounds.west) {\n this.surface.setCamera({ center: { latitude: bounds.north, longitude: bounds.east }, zoom: FIT_MAX_ZOOM }, false);\n } else {\n this.surface.fitBounds(bounds, FIT_PADDING, FIT_MAX_ZOOM);\n }\n }\n\n /** The place the address search last went to; null before one, or once it is cleared. */\n get foundPlace(): MapPlace | null {\n return this.place?.place ?? null;\n }\n\n /**\n * Finds `text` with the provider's search and goes there, as the address search does with Enter:\n * the first place found, pinned, shown in the search box and reported as the box reports one. Null\n * when nothing is found, or the provider has no search.\n */\n async goToAddress(text: string, signal?: AbortSignal): Promise<MapPlace | null> {\n const place = await this.findAddress(text, signal);\n if (!place || this.disposed) return place;\n this.showPlace(place, { animate: true, fromAddress: false });\n this.search?.showChosen(place.label);\n this.events.addressSelected?.(place);\n return place;\n }\n\n /** Takes the place found off the map. */\n clearPlace(): void {\n this.place?.overlay?.remove();\n this.place = null;\n }\n\n /** Empties the address search and takes the place it found off the map, as its clear button does. */\n clearAddress(): void {\n if (this.search) {\n this.search.clear();\n return;\n }\n this.clearSearchPlace();\n }\n\n // Takes the place the address search went to off the map, and says so. The address the options\n // name is the page's, not the search's: it stays.\n private clearSearchPlace(): void {\n if (!this.place || this.place.fromAddress) return;\n this.clearPlace();\n if (this.addressPlace) this.showPlace(this.addressPlace, { move: false, fromAddress: true });\n this.events.addressSelected?.(null);\n }\n\n /**\n * Whether the map can be made into an image — saved, or printed as one: its provider's map can be\n * copied. Google's can't; it is printed as it is on the page.\n */\n get canSaveImage(): boolean {\n return typeof this.surface?.capture === 'function';\n }\n\n /**\n * The map as an image, as it shows now: the provider's map once its tiles are in, the pins and\n * clusters over it, the place found, `legend` in the bottom left corner, the provider's attribution\n * in the bottom right and, while a popup is open, `popup` where it is. Null before the map is\n * drawn, or when its provider's map can't be copied (`canSaveImage`).\n */\n async toImage(legend?: readonly MapLegendEntry[], popup?: MapPrintPopup): Promise<HTMLCanvasElement | null> {\n const surface = this.surface;\n if (!surface?.capture || !this.markers) return null;\n const width = this.container.clientWidth;\n const height = this.container.clientHeight;\n if (!width || !height) return null;\n\n const pixelRatio = Math.min(\n Math.max(IMAGE_PIXEL_RATIO, globalThis.devicePixelRatio || 1),\n IMAGE_MAX_SIZE / Math.max(width, height),\n );\n const map = await surface.capture(pixelRatio);\n // Drawn again by another provider, or gone, while its tiles came.\n if (this.disposed || this.surface !== surface || !this.markers) return null;\n\n const color = this.colorResolver();\n const colors = this.imageColors(color);\n return drawMapImage({\n map,\n width,\n height,\n marks: this.markers.marks().map((mark) => ({\n ...mark,\n color: color(mark.color) ?? color(DEFAULT_ITEM_COLOR) ?? '#0f6cbd',\n point: surface.project(mark.position),\n })),\n place: this.place?.overlay && isValidPosition(this.place.place.position) ? surface.project(this.place.place.position) : null,\n legend: (legend ?? []).map((entry) => ({ label: entry.label, color: color(entry.color) ?? colors.foreground })),\n attribution: surface.attributionText?.() ?? '',\n popup: await this.printedPopup(popup, width, height, pixelRatio),\n colors,\n font: this.font(),\n });\n }\n\n /**\n * Saves the map's image (`toImage`) as a PNG file of that name. False when the map can't be made\n * into one.\n */\n async saveImage(fileName = 'map', legend?: readonly MapLegendEntry[], popup?: MapPrintPopup): Promise<boolean> {\n const image = await this.toImage(legend, popup);\n if (!image) return false;\n await saveCanvas(image, pngFileName(fileName));\n return true;\n }\n\n /**\n * Prints the map with `options.title` above it and `options.entries` listed under it: its image\n * (`toImage`), with the legend, in a frame of its own — or, for a provider whose map can't be\n * copied, the map as it is on the page, the rest of the page left out.\n */\n async print(options: MapPrintOptions = {}): Promise<void> {\n if (!this.surface) return;\n const color = this.colorResolver();\n const sheet: MapPrintSheet = {\n ...options,\n ...(options.entries && {\n entries: options.entries.map((entry) => ({ ...entry, ...(entry.color && { color: color(entry.color) ?? entry.color }) })),\n }),\n language: this.options.language,\n font: this.font(),\n onColor: this.imageColors(color).onColor,\n badgeColor: color(DEFAULT_ITEM_COLOR) ?? '#0f6cbd',\n };\n\n const image = await this.toImage(options.legend, options.popup);\n if (this.disposed) return;\n if (image) {\n await printImage(this.container.ownerDocument, await canvasBlob(image), sheet);\n } else {\n // The map's own element — the host's, around the container — with its legend and messages.\n printPage(this.container.parentElement ?? this.container, sheet);\n }\n }\n\n // The popup open on the map, as the image draws it: none once its point is panned off the map,\n // where the page shows none either. A picture of it as the page shows it, where the browser can make\n // one; else a card of what it says — the page's own content read from the popup as it is now.\n private async printedPopup(\n content: MapPrintPopup | undefined,\n width: number,\n height: number,\n ratio: number,\n ): Promise<NonNullable<MapImageParts['popup']> | null> {\n const open = this.popup;\n if (!content || !open || !this.surface) return null;\n const point = this.surface.project(open.position);\n if (point.x < 0 || point.y < 0 || point.x > width || point.y > height) return null;\n const card = open.element.querySelector('.ppp-map-popup') ?? open.element;\n const snapshot = await snapshotElement(card, this.snapshotFrame(), ratio);\n // Closed, or another opened, while its picture was made: the image shows none.\n if (this.disposed || this.popup !== open) return null;\n const shown = content.fromPage ? readPopupContent(open.element) : content;\n return { content: shown, point, offset: open.offset, ...(snapshot && { snapshot }) };\n }\n\n // Where the map's own pixels start on the page — inside its border — and how much the page scales\n // them: the image is drawn in the map's own pixels, as the pins are projected.\n private snapshotFrame(): SnapshotFrame {\n const box = this.container.getBoundingClientRect();\n const scale = this.container.offsetWidth ? box.width / this.container.offsetWidth : 1;\n return { left: box.left + this.container.clientLeft * scale, top: box.top + this.container.clientTop * scale, scale };\n }\n\n // Each color resolved where the map is, once however many marks share it.\n private colorResolver(): (value: string) => string | null {\n const resolved = new Map<string, string | null>();\n return (value) => {\n if (!resolved.has(value)) resolved.set(value, resolveColor(value, this.container));\n return resolved.get(value)!;\n };\n }\n\n private imageColors(color: (value: string) => string | null) {\n return {\n background: color('var(--colorNeutralBackground1, #ffffff)') ?? '#ffffff',\n foreground: color('var(--colorNeutralForeground1, #242424)') ?? '#242424',\n secondary: color('var(--colorNeutralForeground3, #616161)') ?? '#616161',\n stroke: color('var(--colorNeutralStroke2, #e0e0e0)') ?? '#e0e0e0',\n onColor: color('var(--colorNeutralForegroundOnBrand, #ffffff)') ?? '#ffffff',\n place: color(PLACE_COLOR) ?? '#d13438',\n };\n }\n\n private font(): string {\n return getComputedStyle(this.container).fontFamily || \"'Segoe UI', sans-serif\";\n }\n\n /** Marks the marker of that id as the one whose popup is open; null for none. */\n select(id: string | null): void {\n this.markers?.setSelected(id);\n }\n\n /**\n * Keeps the host's popup element above `position` as the map moves — above the pin for a marker,\n * just above the point for anything else — and pans the map so it is all in view.\n */\n showPopup(element: HTMLElement, position: MapPosition, kind: 'marker' | 'shape'): void {\n if (!isValidPosition(position)) return;\n this.popup = { element, position, offset: kind === 'marker' ? MARKER_POPUP_OFFSET : SHAPE_POPUP_OFFSET };\n element.hidden = false;\n this.placePopup();\n this.keepInViewPending = false;\n this.popupObserver?.disconnect();\n if (this.popupObserver) {\n // Measured as it starts observing, once the popup has drawn its content, and again whenever\n // its size changes.\n this.popupObserver.observe(element);\n } else {\n requestAnimationFrame(() => {\n if (this.popup?.element === element) this.keepPopupInView();\n });\n }\n }\n\n hidePopup(): void {\n if (this.popup) this.popup.element.hidden = true;\n this.popup = null;\n this.popupObserver?.disconnect();\n }\n\n /** Puts keyboard focus on the marker of that id, when it is shown on its own. */\n focusMarker(id: string): void {\n this.markers?.elementOf(id)?.focus();\n }\n\n dispose(): void {\n this.disposed = true;\n this.addressRequest?.abort();\n this.addressRequest = null;\n this.search?.dispose();\n this.search = null;\n this.clearPlace();\n this.stopWatching();\n this.resizeObserver?.disconnect();\n this.popupObserver?.disconnect();\n this.markers?.dispose();\n this.surface?.dispose();\n this.surface = null;\n this.surfaceElement.remove();\n }\n\n private async draw(camera: MapCamera | null): Promise<void> {\n const generation = ++this.drawGeneration;\n const overtaken = () => this.disposed || generation !== this.drawGeneration;\n\n let settings: Awaited<ReturnType<typeof resolveProviderSettings>>;\n let provider: Awaited<ReturnType<typeof findMapProvider>>;\n try {\n // The portal's settings for the provider, then its code. Either can fail: the portal not set\n // up for it, the network, a deploy that replaced the code.\n settings = await resolveProviderSettings(this.options.provider, this.options.portalSettings);\n if (overtaken()) return;\n provider = await findMapProvider(settings.name);\n } catch (error) {\n if (!overtaken()) this.events.error?.('failed', error instanceof Error ? error.message : String(error));\n return;\n }\n if (overtaken()) return;\n if (!provider) {\n this.events.error?.('unknown-provider', settings.name);\n return;\n }\n\n const events: MapSurfaceEvents = {\n click: (position) => this.events.mapClick?.({ position }),\n shapeClick: (id, position) => this.events.itemClick?.({ id, position }),\n viewChanging: () => {\n this.moving = true;\n this.placePopup();\n },\n redrawn: () => this.placePopup(),\n viewChanged: () => {\n this.moving = false;\n this.markers?.refresh();\n this.placePopup();\n if (this.keepInViewPending) {\n this.keepInViewPending = false;\n this.keepPopupInView();\n }\n const view = this.surface?.getView();\n if (view) this.events.viewChanged?.(view);\n },\n error: (message) => this.events.error?.('failed', message),\n };\n\n // Each map gets an element of its own, filling the surface's: a provider styles the element it\n // is given — MapLibre and Google both make it `position: relative` — which would undo the\n // surface's own placement, and a map drawn again starts from a clean one.\n const element = this.container.ownerDocument.createElement('div');\n element.style.width = '100%';\n element.style.height = '100%';\n this.surfaceElement.replaceChildren(element);\n\n let surface: MapSurface;\n try {\n surface = await provider.create({\n container: element,\n settings: settings as never,\n style: this.options.style,\n dark: this.dark,\n language: this.options.language,\n camera: camera ?? WORLD_CAMERA,\n ...(this.options.nativeOptions ? { nativeOptions: this.options.nativeOptions } : {}),\n ...(this.options.gestureHelp ? { gestureHelp: this.options.gestureHelp } : {}),\n events,\n });\n } catch (error) {\n if (!overtaken()) this.events.error?.('failed', error instanceof Error ? error.message : String(error));\n return;\n }\n\n if (overtaken()) {\n surface.dispose();\n return;\n }\n\n this.surface = surface;\n this.drawnShapes = null;\n // A place found stays pinned on the provider's map drawn again.\n if (this.place) this.showPlace(this.place.place, { move: false, fromAddress: this.place.fromAddress });\n this.applySearch();\n if (this.markers) {\n this.markers.moveTo(surface);\n } else {\n this.markers = new MarkerLayer(surface, this.container.ownerDocument, {\n clusterLabel: (count) => this.options.clusterLabel(count),\n onMarkerClick: (marker) => this.events.itemClick?.({ id: marker.id, position: marker.position }),\n onClusterClick: (position, zoom, markers) => this.clusterClicked(position, zoom, markers),\n });\n }\n\n this.applyItems();\n if (!camera) this.fitToItems();\n }\n\n // The address search: shown while asked for and the provider has a search, its words kept current.\n // Taken away, it takes its place off the map with it; while the map is being drawn again it waits,\n // its text kept, for the map it searches.\n private applySearch(): void {\n if (!this.surface) return;\n const options = this.options.addressSearch;\n const geocoder = this.surface.geocoder ?? null;\n if (!options || !geocoder) {\n this.search?.dispose();\n this.search = null;\n this.searchGeocoder = null;\n this.clearSearchPlace();\n return;\n }\n if (this.search) {\n this.search.setLabels(options);\n if (geocoder !== this.searchGeocoder) this.search.forgetSuggestions();\n this.searchGeocoder = geocoder;\n return;\n }\n this.searchGeocoder = geocoder;\n this.search = new AddressSearchBox(\n this.container.ownerDocument,\n {\n suggestsAsYouType: () => this.surface?.geocoder?.suggestsAsYouType ?? false,\n suggest: (text, signal) => this.suggestAddresses(text, signal),\n choose: (suggestion) => this.chooseAddress(suggestion),\n clear: () => this.clearSearchPlace(),\n },\n options,\n );\n this.container.append(this.search.element);\n }\n\n private addressQuery(view: MapView) {\n return { view, countries: this.options.addressSearch?.countries ?? [], language: this.options.language };\n }\n\n private async suggestAddresses(text: string, signal: AbortSignal): Promise<MapAddressSuggestion[]> {\n const geocoder = this.surface?.geocoder;\n const view = this.surface?.getView();\n if (!geocoder || !view) return [];\n return geocoder.suggest({ ...this.addressQuery(view), text, signal });\n }\n\n private async chooseAddress(suggestion: MapAddressSuggestion): Promise<boolean> {\n const place = await this.surface?.geocoder?.resolve(suggestion);\n if (!place || this.disposed) return false;\n this.showPlace(place, { animate: true, fromAddress: false });\n this.events.addressSelected?.(place);\n return true;\n }\n\n // The first place the provider's search finds for `text`. Null when it finds none, or there is\n // no search.\n private async findAddress(text: string, signal?: AbortSignal): Promise<MapPlace | null> {\n const geocoder = this.surface?.geocoder;\n if (!geocoder || !text.trim()) return null;\n // A map not yet given its view — one in a dialog still opening — searches the world.\n const view = this.surface?.getView() ?? {\n ...WORLD_CAMERA,\n bounds: approximateBounds(WORLD_CAMERA.center, WORLD_CAMERA.zoom, this.container.clientWidth || 800, this.container.clientHeight || 600),\n };\n const [first] = await geocoder.suggest({ ...this.addressQuery(view), text: text.trim(), ...(signal ? { signal } : {}) });\n return first ? await geocoder.resolve(first, signal) : null;\n }\n\n // Finds the address the options name and pins it, the search before it given up; the place it\n // pinned goes when the address does, or when the new one isn't found. `animate` moves the view\n // there gradually — not as the map is first drawn, when it starts out looking at the world.\n private async showAddress(animate: boolean): Promise<void> {\n this.addressRequest?.abort();\n this.addressRequest = null;\n // A map that failed to draw has said so already.\n if (!this.surface || this.disposed) return;\n const text = this.options.address?.trim();\n this.addressPlace = null;\n if (!text) {\n if (this.place?.fromAddress) this.clearPlace();\n return;\n }\n\n const request = new AbortController();\n this.addressRequest = request;\n this.events.addressStatus?.('searching');\n let status: MapAddressStatus;\n try {\n const place = this.surface.geocoder ? await this.findAddress(text, request.signal) : null;\n if (request.signal.aborted || this.disposed) return;\n if (place) {\n this.addressPlace = place;\n this.showPlace(place, { animate, fromAddress: true });\n } else if (this.place?.fromAddress) {\n this.clearPlace();\n }\n // A provider without a search can't look for it: as good as a search that failed.\n status = place ? 'found' : this.surface?.geocoder ? 'not-found' : 'failed';\n } catch {\n if (request.signal.aborted || this.disposed) return;\n if (this.place?.fromAddress) this.clearPlace();\n status = 'failed';\n } finally {\n if (this.addressRequest === request) this.addressRequest = null;\n }\n this.events.addressStatus?.(status);\n }\n\n // Pins the place found — the one place, replacing any before it — and, unless `move` is false,\n // brings it into view: its area fitted, or the streets around a point.\n private showPlace(\n place: MapPlace,\n { move = true, animate = false, fromAddress }: { move?: boolean; animate?: boolean; fromAddress: boolean },\n ): void {\n this.place?.overlay?.remove();\n this.place = { place, overlay: null, fromAddress };\n if (!this.surface || !isValidPosition(place.position)) return;\n\n const element = this.container.ownerDocument.createElement('div');\n element.className = 'ppp-map-place';\n element.innerHTML = PIN_SVG;\n element.setAttribute('role', 'img');\n element.setAttribute('aria-label', place.label);\n element.dataset.pppTooltip = place.label;\n this.place.overlay = this.surface.addOverlay(element, place.position, 'bottom');\n\n if (!move) return;\n this.fitPending = false;\n if (place.bounds) this.surface.fitBounds(place.bounds, FIT_PADDING, PLACE_MAX_ZOOM);\n else this.surface.setCamera({ center: place.position, zoom: PLACE_ZOOM }, animate);\n }\n\n // The same provider's map drawn again where it was looking — for a change it can't make in place.\n private async redraw(): Promise<void> {\n const camera = this.surface?.getView() ?? this.options.camera ?? null;\n // The place found's pin goes with the map; it is pinned on the new one as it is drawn.\n this.place?.overlay?.remove();\n if (this.place) this.place.overlay = null;\n this.surface?.dispose();\n this.surface = null;\n this.dark = this.options.usePortalTheme && isDarkTheme(this.container);\n await this.draw(camera ? { center: camera.center, zoom: camera.zoom } : null);\n }\n\n private applyItems(): void {\n if (!this.surface || !this.markers) return;\n\n const markers: MapMarker[] = [];\n this.shapes = [];\n for (const item of this.items) {\n if (item.kind === 'marker') markers.push(item);\n else this.shapes.push(item);\n }\n\n this.markers.setMarkers(markers, this.options.cluster);\n this.drawnShapes = null;\n this.drawShapes();\n }\n\n // A surface draws on a canvas or with the provider's own shapes, which take a color, not a CSS\n // variable: each is resolved where the map is, and again when the theme changes.\n private drawShapes(): void {\n if (!this.surface) return;\n\n // Each color once, however many shapes share it.\n const resolved = new Map<string, string | null>();\n const resolve = (color: string) => {\n if (!resolved.has(color)) resolved.set(color, resolveColor(color, this.container));\n return resolved.get(color);\n };\n const fallback = resolve(DEFAULT_ITEM_COLOR) ?? '#0f6cbd';\n const colors = this.shapes.map((shape) => (shape.color && resolve(shape.color)) || fallback);\n\n // Watched attributes change for all sorts of reasons — a dialog opening, a class toggled — and\n // a provider that rebuilds its shapes for each would do so for nothing.\n const key = colors.join('|');\n if (this.drawnShapes?.shapes === this.shapes && this.drawnShapes.colors === key) return;\n this.drawnShapes = { shapes: this.shapes, colors: key };\n\n this.surface.setShapes(this.shapes.map((shape, index) => ({ ...shape, color: colors[index]! })));\n }\n\n private clusterClicked(position: MapPosition, zoom: number | null, markers: MapMarker[]): void {\n if (zoom !== null && this.surface) {\n this.surface.setCamera({ center: position, zoom }, true);\n return;\n }\n this.events.clusterClick?.({ ids: markers.map((marker) => marker.id), position });\n }\n\n private resized(): void {\n this.surface?.resize();\n if (this.fitPending) this.fitToItems(this.fitPendingIds);\n }\n\n private themeChanged(): void {\n if (this.disposed) return;\n this.drawShapes();\n\n const dark = this.options.usePortalTheme && isDarkTheme(this.container);\n if (dark === this.dark || !this.surface) return;\n this.dark = dark;\n if (!this.surface.setStyle(this.options.style, dark)) void this.redraw();\n }\n\n private placePopup(): void {\n if (!this.popup || !this.surface) return;\n const point = this.surface.project(this.popup.position);\n const style = this.popup.element.style;\n style.left = `${point.x}px`;\n style.top = `${point.y - this.popup.offset}px`;\n style.transform = 'translate(-50%, -100%)';\n }\n\n // Keeps the popup in view now, or once the map stops moving.\n private requestKeepInView(): void {\n if (this.moving) this.keepInViewPending = true;\n else this.keepPopupInView();\n }\n\n private keepPopupInView(): void {\n if (!this.popup || !this.surface) return;\n const margin = 12;\n const popup = this.popup.element.getBoundingClientRect();\n const map = this.container.getBoundingClientRect();\n\n let x = 0;\n let y = 0;\n if (popup.top < map.top + margin) y = popup.top - map.top - margin;\n if (popup.left < map.left + margin) x = popup.left - map.left - margin;\n else if (popup.right > map.right - margin) x = popup.right - map.right + margin;\n if (x !== 0 || y !== 0) this.surface.panBy(x, y);\n }\n}\n\n// A file name for the map's image: what Windows and macOS don't allow in one left out, ending .png.\nfunction pngFileName(name: string): string {\n const cleaned =\n name\n .replace(/[\\\\/:*?\"<>|\\u0000-\\u001f]+/g, ' ')\n .replace(/\\s+/g, ' ')\n .trim()\n .replace(/\\.png$/i, '') || 'map';\n return `${cleaned}.png`;\n}\n","import Supercluster, { type ClusterProperties } from 'supercluster';\nimport { boundsContain, isValidPosition, padBounds, toBoundingBox } from './geo.js';\nimport type { MapOverlay, MapSurface } from './provider.js';\nimport { DEFAULT_ITEM_COLOR } from './theme.js';\nimport type { MapMarker, MapPosition, MapView } from './types.js';\n\n/**\n * Pins within this many CSS pixels of each other gather into a cluster. Cluster zooms are counted\n * on 256-pixel tiles, as the map's zoom is, so an extent of 256 makes the radius screen pixels.\n */\nconst CLUSTER_RADIUS = 60;\nconst CLUSTER_EXTENT = 256;\n\n/** The last zoom with clusters: past it, every pin shows, so a street's pins can be told apart. */\nexport const CLUSTER_MAX_ZOOM = 17;\n\n/** The pin's outline, in a 24 by 32 box with its point at the bottom center. */\nexport const PIN_PATH = 'M12 1C5.9 1 1 5.9 1 12c0 8.3 11 19 11 19s11-10.7 11-19C23 5.9 18.1 1 12 1z';\n\n/** The marker's pin, drawn in its color with the page's background as its outline and center. */\nexport const PIN_SVG =\n '<svg viewBox=\"0 0 24 32\" width=\"24\" height=\"32\" aria-hidden=\"true\" focusable=\"false\">' +\n `<path d=\"${PIN_PATH}\" class=\"ppp-map-marker-pin\"/>` +\n '<circle cx=\"12\" cy=\"12\" r=\"4.25\" class=\"ppp-map-marker-dot\"/>' +\n '</svg>';\n\nexport interface MarkerLayerOptions {\n /** A cluster's accessible name for its count, such as \"12 items\". */\n clusterLabel: (count: number) => string;\n onMarkerClick: (marker: MapMarker) => void;\n /** A cluster was clicked: zoom to `zoom` at `position`, or show `markers` when they share a place. */\n onClusterClick: (position: MapPosition, zoom: number | null, markers: MapMarker[]) => void;\n}\n\ninterface Shown {\n overlay: MapOverlay;\n element: HTMLElement;\n mark: MarkerMark;\n}\n\n/** A pin or cluster on the map, as the map's image draws it. */\nexport type MarkerMark =\n | { kind: 'marker'; position: MapPosition; color: string; label?: string }\n | { kind: 'cluster'; position: MapPosition; color: string; text: string; size: 'small' | 'medium' | 'large' };\n\ntype MarkerProperties = { index: number };\n// What a cluster carries of its markers: their color when they all share one, null when they don't.\ntype ClusterColor = { color: string | null };\n\n/**\n * The map's pins and clusters: elements of the map's own, the same on every provider, placed by the\n * provider's overlays. Clusters are worked out for the view whenever it settles, and only what is\n * in view, or about to be, is on the page.\n */\nexport class MarkerLayer {\n private markers: MapMarker[] = [];\n private index: Supercluster<MarkerProperties, ClusterColor> | null = null;\n private readonly shown = new Map<string, Shown>();\n private selectedId: string | null = null;\n\n constructor(\n private surface: MapSurface,\n private readonly document: Document,\n private readonly options: MarkerLayerOptions,\n ) {}\n\n /** Replaces the markers, clustered or not. */\n setMarkers(markers: readonly MapMarker[], cluster: boolean): void {\n this.markers = markers.filter((marker) => isValidPosition(marker.position));\n this.index = cluster\n ? new Supercluster<MarkerProperties, ClusterColor>({\n radius: CLUSTER_RADIUS,\n extent: CLUSTER_EXTENT,\n maxZoom: CLUSTER_MAX_ZOOM,\n // A cluster of one kind of marker — a view's rows, drawn in their color — is drawn in it too.\n map: (properties) => ({ color: this.markers[properties.index]?.color ?? '' }),\n reduce: (cluster, properties) => {\n if (cluster.color !== properties.color) cluster.color = null;\n },\n }).load(\n this.markers.map((marker, index) => ({\n type: 'Feature',\n properties: { index },\n geometry: { type: 'Point', coordinates: [marker.position.longitude, marker.position.latitude] },\n })),\n )\n : null;\n\n this.clear();\n this.refresh();\n }\n\n /** Draws on a new surface: the same provider's map drawn again. */\n moveTo(surface: MapSurface): void {\n this.clear();\n this.surface = surface;\n this.refresh();\n }\n\n /** Shows what the current view holds. */\n refresh(): void {\n const view = this.surface.getView();\n const wanted = new Map<string, () => HTMLElement>();\n const marks = new Map<string, MarkerMark>();\n\n for (const entry of this.visible(view)) {\n wanted.set(entry.key, entry.create);\n marks.set(entry.key, entry.mark);\n }\n\n for (const [key, shown] of this.shown) {\n if (!wanted.has(key)) {\n shown.overlay.remove();\n this.shown.delete(key);\n }\n }\n\n for (const [key, create] of wanted) {\n if (this.shown.has(key)) continue;\n const element = create();\n const mark = marks.get(key)!;\n const anchor = mark.kind === 'cluster' ? 'center' : 'bottom';\n this.shown.set(key, { element, mark, overlay: this.surface.addOverlay(element, mark.position, anchor) });\n }\n }\n\n /** The pins and clusters on the map now, as its image draws them. */\n marks(): MarkerMark[] {\n return [...this.shown.values()].map((shown) => shown.mark);\n }\n\n /** Marks the marker of that id as the one whose popup is open; null for none. */\n setSelected(id: string | null): void {\n this.selectedId = id;\n for (const [key, shown] of this.shown) {\n if (key.startsWith('m:')) shown.element.toggleAttribute('data-selected', key === `m:${id}`);\n }\n }\n\n /** The element of the marker of that id, when it is shown on its own — not in a cluster. */\n elementOf(id: string): HTMLElement | null {\n return this.shown.get(`m:${id}`)?.element ?? null;\n }\n\n dispose(): void {\n this.clear();\n this.markers = [];\n this.index = null;\n }\n\n private clear(): void {\n for (const shown of this.shown.values()) shown.overlay.remove();\n this.shown.clear();\n }\n\n // What to show for the view: clusters and lone markers from the index, or, without one, every\n // marker near the view. A little beyond it either way, so a short pan finds them already there.\n private *visible(view: MapView): Generator<{ key: string; mark: MarkerMark; create: () => HTMLElement }> {\n const area = padBounds(view.bounds, 0.25);\n\n if (!this.index) {\n for (const marker of this.markers) {\n if (boundsContain(area, marker.position)) {\n yield { key: `m:${marker.id}`, mark: markerMark(marker), create: () => this.markerElement(marker) };\n }\n }\n return;\n }\n\n const [west, south, east, north] = toBoundingBox(area);\n const zoom = Math.max(0, Math.floor(view.zoom));\n // A box across the antimeridian is asked for as its two halves.\n const boxes: [number, number, number, number][] =\n west <= east ? [[west, south, east, north]] : [[west, south, 180, north], [-180, south, east, north]];\n\n for (const box of boxes) {\n for (const feature of this.index.getClusters(box, zoom)) {\n const [longitude, latitude] = feature.geometry.coordinates as [number, number];\n const position = { latitude, longitude };\n const properties = feature.properties as MarkerProperties | (ClusterProperties & ClusterColor);\n\n if ('cluster' in properties && properties.cluster) {\n const id = properties.cluster_id;\n const count = properties.point_count;\n yield {\n key: `c:${id}`,\n mark: {\n kind: 'cluster',\n position,\n color: properties.color || DEFAULT_ITEM_COLOR,\n text: clusterText(count),\n size: clusterSize(count),\n },\n create: () => this.clusterElement(id, count, position, properties.color),\n };\n } else {\n const marker = this.markers[(properties as MarkerProperties).index]!;\n yield { key: `m:${marker.id}`, mark: markerMark(marker), create: () => this.markerElement(marker) };\n }\n }\n }\n }\n\n private markerElement(marker: MapMarker): HTMLElement {\n const element = this.document.createElement('button');\n element.type = 'button';\n element.className = 'ppp-map-marker';\n element.innerHTML = PIN_SVG;\n element.style.setProperty('--ppp-map-item-color', marker.color || DEFAULT_ITEM_COLOR);\n const label = markerLabel(marker);\n if (label) {\n // In place of the dot, smaller as it grows longer.\n const text = this.document.createElement('span');\n text.className = 'ppp-map-marker-label';\n text.dataset.length = String(Math.min(label.length, 5));\n text.textContent = label;\n element.appendChild(text);\n element.toggleAttribute('data-labeled', true);\n }\n // Named for a screen reader, and in the page's Fluent tooltip (React: the map's own) — one for\n // every pin and cluster rather than the browser's.\n if (marker.title) {\n element.dataset.pppTooltip = marker.title;\n element.setAttribute('aria-label', marker.title);\n }\n element.toggleAttribute('data-selected', marker.id === this.selectedId);\n element.addEventListener('click', (event) => {\n // The map's own click handler would take it as a click on the map.\n event.stopPropagation();\n this.options.onMarkerClick(marker);\n });\n return element;\n }\n\n private clusterElement(clusterId: number, count: number, position: MapPosition, color: string | null): HTMLElement {\n const element = this.document.createElement('button');\n element.type = 'button';\n element.className = 'ppp-map-cluster';\n element.textContent = clusterText(count);\n element.dataset.size = clusterSize(count);\n if (color) element.style.setProperty('--ppp-map-item-color', color);\n const label = this.options.clusterLabel(count);\n element.dataset.pppTooltip = label;\n element.setAttribute('aria-label', label);\n element.addEventListener('click', (event) => {\n event.stopPropagation();\n this.clusterClicked(clusterId, position);\n });\n return element;\n }\n\n private clusterClicked(clusterId: number, position: MapPosition): void {\n if (!this.index) return;\n\n const zoom = this.index.getClusterExpansionZoom(clusterId);\n const leaves = this.index\n .getLeaves(clusterId, Infinity)\n .map((leaf) => this.markers[(leaf.properties as MarkerProperties).index]!);\n\n // Pins at one place — the contacts at one address — never come apart by zooming, so they are\n // listed instead.\n const first = leaves[0]?.position;\n const together = leaves.every(\n (marker) => marker.position.latitude === first?.latitude && marker.position.longitude === first?.longitude,\n );\n // A cluster's own position is its pins' average, a hair off where they all are.\n this.options.onClusterClick(together && first ? first : position, together ? null : zoom, leaves);\n }\n}\n\n// What a cluster says of its count, and how big it is drawn.\nconst clusterText = (count: number) => (count > 999 ? `${Math.floor(count / 1000)}k` : String(count));\nconst clusterSize = (count: number) => (count < 10 ? 'small' : count < 100 ? 'medium' : 'large');\n\n// A marker's label as drawn: none when blank.\nfunction markerLabel(marker: MapMarker): string | undefined {\n return marker.label?.trim() || undefined;\n}\n\nfunction markerMark(marker: MapMarker): MarkerMark {\n const label = markerLabel(marker);\n return { kind: 'marker', position: marker.position, color: marker.color || DEFAULT_ITEM_COLOR, ...(label && { label }) };\n}\n","/** The color a marker or shape takes when its item names none: the portal's accent. */\nexport const DEFAULT_ITEM_COLOR = 'var(--colorBrandBackground, #0f6cbd)';\n\n/** A CSS color as `rgb()`, or null when the browser can't read it. A Fluent token resolves where `scope` is. */\nexport function resolveColor(value: string, scope: HTMLElement): string | null {\n const probe = scope.ownerDocument.createElement('span');\n probe.style.color = value;\n if (!probe.style.color) return null;\n\n probe.style.display = 'none';\n scope.appendChild(probe);\n try {\n // A variable the page doesn't define is left as written.\n const color = getComputedStyle(probe).color;\n return color && !color.includes('var(') ? color : null;\n } finally {\n probe.remove();\n }\n}\n\n/** The channels of an `rgb()` / `rgba()` color, or null. */\nfunction channels(color: string): [number, number, number] | null {\n const match = /^rgba?\\(\\s*([\\d.]+)[\\s,]+([\\d.]+)[\\s,]+([\\d.]+)/.exec(color.trim());\n return match ? [Number(match[1]), Number(match[2]), Number(match[3])] : null;\n}\n\n/**\n * Whether the portal's theme is dark where `element` is: its Fluent background darker than mid\n * gray. False on a page without Fluent's tokens.\n */\nexport function isDarkTheme(element: HTMLElement): boolean {\n const background = getComputedStyle(element).getPropertyValue('--colorNeutralBackground1').trim();\n if (!background) return false;\n\n const rgb = channels(resolveColor(background, element) ?? '');\n if (!rgb) return false;\n\n // Relative luminance, from sRGB.\n const [r, g, b] = rgb.map((channel) => {\n const value = channel / 255;\n return value <= 0.04045 ? value / 12.92 : ((value + 0.055) / 1.055) ** 2.4;\n }) as [number, number, number];\n return 0.2126 * r + 0.7152 * g + 0.0722 * b < 0.2;\n}\n\n/**\n * Calls `onChange`, at most once a frame, whenever the theme may have changed where `element` is:\n * an attribute changing on one of its ancestors — a theme reaches it through them, as a Fluent\n * provider's class or style or the root's — or the system's light or dark preference. Returns the\n * function that stops watching.\n */\nexport function watchTheme(element: HTMLElement, onChange: () => void): () => void {\n let pending = false;\n const notify = () => {\n if (pending) return;\n pending = true;\n requestAnimationFrame(() => {\n pending = false;\n onChange();\n });\n };\n\n const observer = new MutationObserver(notify);\n for (let ancestor = element.parentElement; ancestor; ancestor = ancestor.parentElement) {\n observer.observe(ancestor, { attributes: true });\n }\n\n const scheme = globalThis.matchMedia?.('(prefers-color-scheme: dark)');\n scheme?.addEventListener('change', notify);\n\n return () => {\n observer.disconnect();\n scheme?.removeEventListener('change', notify);\n };\n}\n","import type { MapPrintPopup } from './types.js';\n\n// The elements that start a line of their own, where the browser can't say how they show.\nconst BLOCKS = new Set([\n 'address', 'article', 'blockquote', 'dd', 'div', 'dl', 'dt', 'figcaption', 'figure', 'footer', 'h1', 'h2', 'h3', 'h4',\n 'h5', 'h6', 'header', 'li', 'ol', 'p', 'section', 'table', 'tr', 'ul',\n]);\n// The ways of showing that start a line of their own.\nconst BLOCK_DISPLAYS = new Set(['block', 'flex', 'grid', 'list-item', 'table', 'table-row', 'flow-root']);\n// What a popup shows that isn't what it says: its buttons — Close among them, Fluent's own too —\n// pictures and scripts.\nconst SKIPPED = new Set(['button', 'fluent-button', 'img', 'picture', 'script', 'style', 'svg', 'template']);\n// The inputs whose value isn't text a visitor typed or chose.\nconst UNREAD_INPUTS = new Set(['button', 'checkbox', 'file', 'hidden', 'image', 'password', 'radio', 'reset', 'submit']);\n\nconst clean = (text: string) => text.replace(/\\s+/g, ' ').trim();\n\n// How an element shows, where the browser can say: none where it lays nothing out.\nconst displayOf = (element: Element) => {\n const view = element.ownerDocument.defaultView;\n return view?.getComputedStyle ? view.getComputedStyle(element) : null;\n};\n\n/**\n * What a page's own popup content shows, read from the popup as it is now — figures that came after\n * it opened included: its first line, ahead of any field, as its title; its `<dt>` / `<dd>` pairs\n * as fields; every other line of its text as lines under the title; a form field's choice or text\n * as what it shows. Its buttons and what is hidden aren't read: they aren't what the popup says.\n */\nexport function readPopupContent(element: HTMLElement): Pick<MapPrintPopup, 'title' | 'lines' | 'details'> {\n const lines: string[] = [];\n const details: { label: string; value: string }[] = [];\n // The popup's first line, when it comes ahead of every field: its heading.\n let title: string | undefined;\n let line = '';\n let label: string | undefined;\n\n const endLine = (into: string[]) => {\n const text = clean(line);\n line = '';\n if (!text) return;\n if (into === lines && title === undefined && lines.length === 0 && details.length === 0) title = text;\n else into.push(text);\n };\n // The lines an element's text makes, read apart from the popup's own.\n const linesOf = (node: Element): string[] => {\n const own: string[] = [];\n const before = line;\n line = '';\n walk(node, own);\n const text = clean(line);\n if (text) own.push(text);\n line = before;\n return own;\n };\n\n const walk = (node: Node, into: string[]) => {\n for (const child of Array.from(node.childNodes)) {\n if (child.nodeType === child.TEXT_NODE) {\n line += child.textContent ?? '';\n continue;\n }\n if (child.nodeType !== child.ELEMENT_NODE) continue;\n const element = child as Element;\n const tag = element.tagName.toLowerCase();\n if (SKIPPED.has(tag) || element.getAttribute('role') === 'button' || element.hasAttribute('hidden') || element.getAttribute('aria-hidden') === 'true')\n continue;\n const style = displayOf(element);\n if (style && (style.display === 'none' || style.visibility === 'hidden')) continue;\n\n if (tag === 'select') {\n line += ` ${Array.from((element as HTMLSelectElement).selectedOptions, (option) => option.text).join(', ')} `;\n } else if (tag === 'textarea' || (tag === 'input' && !UNREAD_INPUTS.has((element as HTMLInputElement).type))) {\n line += ` ${(element as HTMLInputElement | HTMLTextAreaElement).value} `;\n } else if (tag === 'br') {\n endLine(into);\n } else if (tag === 'dt') {\n endLine(into);\n label = linesOf(element).join(' ');\n } else if (tag === 'dd') {\n endLine(into);\n const value = linesOf(element).join(' · ');\n if (value) details.push({ label: label ?? '', value });\n label = undefined;\n } else if (BLOCKS.has(tag) || (style !== null && BLOCK_DISPLAYS.has(style.display))) {\n endLine(into);\n walk(element, into);\n endLine(into);\n } else {\n walk(element, into);\n }\n }\n };\n\n walk(element, lines);\n endLine(lines);\n return { ...(title && { title }), ...(lines.length && { lines }), ...(details.length && { details }) };\n}\n","// A picture of the open popup as the page shows it, for the map's image: the popup copied with every\n// element's styles written onto it, put in an SVG's foreignObject and drawn by the browser — so its\n// colors, icons and layout are the page's own. Such a picture loads nothing of its own, so a popup\n// whose text is in a web font or that shows a CSS image gets none, as does a browser that won't let\n// the picture be read back off a canvas (Safari): the image draws the popup's card from what it says\n// instead (readPopupContent).\n\n/** A picture of an element where it is, in the CSS pixels of the map it was taken over. */\nexport interface ElementSnapshot {\n image: HTMLImageElement;\n left: number;\n top: number;\n width: number;\n height: number;\n}\n\n/**\n * Where the map's own pixels start on the page, and how much the page scales them: what an element's\n * place on the page is measured against.\n */\nexport interface SnapshotFrame {\n left: number;\n top: number;\n scale: number;\n}\n\n// Room around the element for its shadow, which falls outside its box.\nconst MARGIN = 24;\n// What a popup shows on the page that its picture leaves out, its place kept: its Close button.\nconst LEFT_OUT = '.ppp-map-popup-close';\nconst XHTML = 'http://www.w3.org/1999/xhtml';\n// The properties an element takes from its parent: written onto the copy only where they differ.\nconst INHERITED = new Set([\n 'color', 'cursor', 'direction', 'fill', 'font-family', 'font-feature-settings', 'font-kerning', 'font-size', 'font-stretch',\n 'font-style', 'font-variant', 'font-variation-settings', 'font-weight', 'hyphens', 'letter-spacing', 'line-height',\n 'list-style-position', 'list-style-type', 'overflow-wrap', 'quotes', 'stroke', 'tab-size', 'text-align', 'text-indent',\n 'text-rendering', 'text-shadow', 'text-transform', 'visibility', 'white-space', 'word-break', 'word-spacing', 'writing-mode',\n '-webkit-font-smoothing',\n]);\n// The properties that load an image, which the picture can't.\nconst IMAGE_PROPERTIES = ['background-image', 'mask-image', '-webkit-mask-image', 'list-style-image', 'border-image-source'];\n\ntype View = Window & typeof globalThis;\n\n/**\n * A picture of `element` as the page shows it now, at `ratio` times its CSS size, placed by where it\n * is in `frame`; null where the browser can't make one that shows it as the page does and can be\n * drawn and read back.\n */\nexport async function snapshotElement(element: Element, frame: SnapshotFrame, ratio: number): Promise<ElementSnapshot | null> {\n const view = element.ownerDocument.defaultView as View | null;\n if (!view || !('decode' in view.HTMLImageElement.prototype)) return null;\n const box = element.getBoundingClientRect();\n if (!box.width || !box.height) return null;\n try {\n if (loadsWhatAPictureCant(element, view)) return null;\n const scale = frame.scale || 1;\n const size = { width: box.width / scale, height: box.height / scale };\n const width = size.width + 2 * MARGIN;\n const height = size.height + 2 * MARGIN;\n const image = new view.Image();\n image.src = `data:image/svg+xml;charset=utf-8,${encodeURIComponent(snapshotMarkup(element, size, ratio))}`;\n await image.decode();\n if (!readable(image, element.ownerDocument)) return null;\n return {\n image,\n left: (box.left - frame.left) / scale - MARGIN,\n top: (box.top - frame.top) / scale - MARGIN,\n width,\n height,\n };\n } catch {\n return null;\n }\n}\n\n/**\n * The SVG an element's picture is drawn from: the element copied with its styles at `size`, `MARGIN`\n * in from the top left, drawn at `ratio` times its size.\n */\nexport function snapshotMarkup(element: Element, size: { width: number; height: number }, ratio: number): string {\n const view = element.ownerDocument.defaultView as View;\n const copy = copyWithStyles(element, view, null);\n if (copy instanceof view.Element) {\n // Where the copy starts, not where the page placed it.\n const style = (copy as HTMLElement).style;\n for (const name of ['position', 'left', 'top', 'right', 'bottom', 'transform', 'translate', 'margin'])\n style.removeProperty(name);\n style.setProperty('width', `${size.width}px`);\n style.setProperty('height', `${size.height}px`);\n style.setProperty('box-sizing', 'border-box');\n }\n const width = size.width + 2 * MARGIN;\n const height = size.height + 2 * MARGIN;\n const frame = element.ownerDocument.createElementNS(XHTML, 'div');\n frame.setAttribute('style', `padding: ${MARGIN}px;`);\n frame.appendChild(copy);\n const markup = new view.XMLSerializer().serializeToString(frame);\n return (\n `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${width * ratio}\" height=\"${height * ratio}\" viewBox=\"0 0 ${width} ${height}\">` +\n `<foreignObject x=\"0\" y=\"0\" width=\"${width}\" height=\"${height}\">${markup}</foreignObject></svg>`\n );\n}\n\n// An element copied with the styles the page gives it written onto it, and those of its ::before and\n// ::after as elements of their own; a component's shadow content in place of what it holds, as the\n// page draws it; form fields with what they show; images as data, the only kind the picture can load.\nfunction copyWithStyles(source: Node, view: View, parent: CSSStyleDeclaration | null): Node {\n if (source.nodeType === source.TEXT_NODE) return source.cloneNode();\n if (!(source instanceof view.Element)) return source.ownerDocument!.createTextNode('');\n const tag = source.tagName.toLowerCase();\n if (tag === 'script' || tag === 'style' || tag === 'template') return source.ownerDocument.createTextNode('');\n\n const style = view.getComputedStyle(source);\n const copy = tag === 'canvas' ? imageOf(source as HTMLCanvasElement) : (source.cloneNode(false) as Element);\n copy.setAttribute('style', cssText(style, parent));\n copy.removeAttribute('class');\n copy.removeAttribute('id');\n // Left out, as an empty box of its size: its own children would show, each visible of its own.\n if (source.matches(LEFT_OUT)) {\n (copy as HTMLElement).style.setProperty('visibility', 'hidden');\n return copy;\n }\n\n if (source instanceof view.HTMLImageElement) copy.setAttribute('src', dataUrlOf(source) ?? '');\n if (source instanceof view.HTMLInputElement) {\n copy.setAttribute('value', source.value);\n if (source.checked) copy.setAttribute('checked', '');\n else copy.removeAttribute('checked');\n }\n if (source instanceof view.HTMLTextAreaElement) copy.textContent = source.value;\n if (tag === 'canvas' || source instanceof view.HTMLTextAreaElement) return copy;\n\n const before = pseudoElement(source, '::before', view, style);\n if (before) copy.appendChild(before);\n for (const child of shownChildren(source, view)) copy.appendChild(copyWithStyles(child, view, style));\n const after = pseudoElement(source, '::after', view, style);\n if (after) copy.appendChild(after);\n\n if (source instanceof view.HTMLSelectElement) {\n // Its options as they are chosen now, not as its markup chose them.\n const copied = (copy as Element).querySelectorAll('option');\n Array.from(source.options).forEach((option, index) => {\n if (option.selected) copied[index]?.setAttribute('selected', '');\n else copied[index]?.removeAttribute('selected');\n });\n }\n return copy;\n}\n\n// What an element shows inside it: its shadow content, each slot filled with what is put in it, or\n// its own children.\nfunction shownChildren(element: Element, view: View): Node[] {\n const own = element.shadowRoot ? Array.from(element.shadowRoot.childNodes) : Array.from(element.childNodes);\n return own.flatMap((child) => {\n if (!(child instanceof view.HTMLSlotElement)) return [child];\n const assigned = child.assignedNodes({ flatten: true });\n return assigned.length ? assigned : Array.from(child.childNodes);\n });\n}\n\n// An element's ::before or ::after, as a span of its own: what it draws, its text included.\nfunction pseudoElement(element: Element, which: '::before' | '::after', view: View, parent: CSSStyleDeclaration): Element | null {\n const style = view.getComputedStyle(element, which);\n const content = style.getPropertyValue('content');\n if (!content || content === 'none' || content === 'normal') return null;\n const span = element.ownerDocument.createElementNS(XHTML, 'span');\n span.setAttribute('style', cssText(style, parent));\n // A quoted string is its text; anything else — a counter, an image — draws its box alone.\n const text = /^([\"'])(.*)\\1$/.exec(content.trim());\n if (text) span.textContent = text[2]!.replace(/\\\\(.)/g, '$1');\n return span;\n}\n\n// The style as text: every property, but those it takes from its parent unchanged.\nfunction cssText(style: CSSStyleDeclaration, parent: CSSStyleDeclaration | null): string {\n let text = '';\n for (let index = 0; index < style.length; index++) {\n const name = style[index]!;\n const value = style.getPropertyValue(name);\n if (parent && INHERITED.has(name) && parent.getPropertyValue(name) === value) continue;\n text += `${name}: ${value};`;\n }\n return text;\n}\n\n// Whether the element shows what its picture couldn't load: text in a web font, or a CSS image.\nfunction loadsWhatAPictureCant(element: Element, view: View): boolean {\n const fonts = element.ownerDocument.fonts as FontFaceSet | undefined;\n const webFonts = new Set<string>();\n fonts?.forEach((face) => {\n if (face.status !== 'error') webFonts.add(face.family.replace(/[\"']/g, '').trim().toLowerCase());\n });\n const loads = (node: Element): boolean => {\n const style = view.getComputedStyle(node);\n if (style.display === 'none') return false;\n if (IMAGE_PROPERTIES.some((name) => style.getPropertyValue(name).includes('url('))) return true;\n const family = style.fontFamily.split(',')[0]?.replace(/[\"']/g, '').trim().toLowerCase();\n if (family && webFonts.has(family)) return true;\n return shownChildren(node, view).some((child) => child instanceof view.Element && !child.matches(LEFT_OUT) && loads(child));\n };\n return loads(element);\n}\n\n// A canvas as the image it holds, where it can be read.\nfunction imageOf(canvas: HTMLCanvasElement): Element {\n const image = canvas.ownerDocument.createElementNS(XHTML, 'img');\n try {\n image.setAttribute('src', canvas.toDataURL());\n } catch {\n // Another site's picture is on it: left blank.\n }\n return image;\n}\n\n// An image as data, where its pixels can be read: one from another site that doesn't allow it is left\n// blank.\nfunction dataUrlOf(image: HTMLImageElement): string | null {\n if (!image.complete || !image.naturalWidth) return null;\n try {\n const canvas = image.ownerDocument.createElement('canvas');\n canvas.width = image.naturalWidth;\n canvas.height = image.naturalHeight;\n canvas.getContext('2d')?.drawImage(image, 0, 0);\n return canvas.toDataURL();\n } catch {\n return null;\n }\n}\n\n// Whether a canvas the picture is drawn on can still be read: one some browsers lock against reading\n// can't be saved or printed.\nfunction readable(image: HTMLImageElement, document: Document): boolean {\n try {\n const canvas = document.createElement('canvas');\n canvas.width = 1;\n canvas.height = 1;\n const context = canvas.getContext('2d');\n if (!context) return false;\n context.drawImage(image, 0, 0, 1, 1);\n context.getImageData(0, 0, 1, 1);\n return true;\n } catch {\n return false;\n }\n}\n","import { PIN_PATH, type MarkerMark } from './markers.js';\nimport { ensureStyleSheet } from './styles.js';\nimport type { ElementSnapshot } from './popup-snapshot.js';\nimport type { MapLegendEntry, MapPoint, MapPrintEntry, MapPrintOptions, MapPrintPopup } from './types.js';\n\n/** The colors the map's image is drawn in, resolved where the map is: never a CSS variable. */\nexport interface MapImageColors {\n /** The page's background: the pins' outline and dot, and the boxes' background. */\n background: string;\n /** The page's text, in the legend and the attribution. */\n foreground: string;\n /** Quieter text: the names of a popup's fields. */\n secondary: string;\n /** A popup's border. */\n stroke: string;\n /** Text on a pin or cluster. */\n onColor: string;\n /** The pin of a place the address search found. */\n place: string;\n}\n\n/** What the map's image is drawn from. */\nexport interface MapImageParts {\n /** The provider's map, as `MapSurface.capture` copied it. */\n map: HTMLCanvasElement;\n /** The map's size in CSS pixels: what the pins' points are measured in. */\n width: number;\n height: number;\n /** The pins and clusters, each at its point on the map, their colors resolved. */\n marks: readonly (MarkerMark & { point: MapPoint })[];\n /** The pin of the place the address search found, at its point. */\n place?: MapPoint | null;\n /** The legend's entries, their colors resolved. */\n legend?: readonly MapLegendEntry[];\n attribution?: string;\n /**\n * The popup open on the map: what it shows, and the point it stands above, `offset` pixels up — or a\n * picture of it as the page shows it, where it is, drawn in place of a card of what it shows.\n */\n popup?: { content: MapPrintPopup; point: MapPoint; offset: number; snapshot?: ElementSnapshot } | null;\n colors: MapImageColors;\n /** The page's font family. */\n font: string;\n}\n\nconst PIN_WIDTH = 24;\nconst PIN_HEIGHT = 32;\n// The pin's head, where its dot or label goes.\nconst PIN_HEAD = { x: 12, y: 12, radius: 4.25 };\nconst CLUSTER_DIAMETER = { small: 32, medium: 38, large: 44 } as const;\nconst LABEL_FONT_SIZE = [11, 11, 11, 9, 7.5, 6];\n// The boxes over the map's corners: their margin and padding, in CSS pixels.\nconst CORNER_MARGIN = 8;\n\n/**\n * The map as an image: the provider's map, the pins and clusters over it as the page draws them, the\n * place found, the legend in the bottom left corner and the provider's attribution in the bottom\n * right, at the copy's resolution.\n */\nexport function drawMapImage(parts: MapImageParts): HTMLCanvasElement {\n const canvas = parts.map.ownerDocument.createElement('canvas');\n canvas.width = parts.map.width;\n canvas.height = parts.map.height;\n const context = canvas.getContext('2d');\n if (!context) throw new Error(\"The browser can't draw the map's image.\");\n\n context.drawImage(parts.map, 0, 0);\n // From here on, in the CSS pixels the points are in.\n const ratio = parts.width > 0 ? parts.map.width / parts.width : 1;\n context.scale(ratio, ratio);\n\n for (const mark of parts.marks) {\n if (mark.kind === 'cluster') drawCluster(context, mark, parts, ratio);\n else drawPin(context, mark.point, mark.color, parts, ratio, mark.label);\n }\n if (parts.place) drawPin(context, parts.place, parts.colors.place, parts, ratio);\n if (parts.legend?.length) drawLegend(context, parts.legend, parts);\n if (parts.attribution) drawAttribution(context, parts.attribution, parts);\n // Last, over the corners, as the page shows it over them.\n if (parts.popup) drawPopup(context, parts.popup, parts, ratio);\n return canvas;\n}\n\nfunction withShadow(context: CanvasRenderingContext2D, ratio: number, blur: number, draw: () => void): void {\n context.save();\n // A shadow is measured in the canvas's own pixels, whatever the scale.\n context.shadowColor = 'rgba(0, 0, 0, 0.35)';\n context.shadowBlur = blur * ratio;\n context.shadowOffsetY = ratio;\n draw();\n context.restore();\n}\n\nfunction drawPin(\n context: CanvasRenderingContext2D,\n point: MapPoint,\n color: string,\n parts: MapImageParts,\n ratio: number,\n label?: string,\n): void {\n context.save();\n context.translate(point.x - PIN_WIDTH / 2, point.y - PIN_HEIGHT);\n const path = new Path2D(PIN_PATH);\n withShadow(context, ratio, 2, () => {\n context.fillStyle = color;\n context.fill(path);\n });\n context.lineWidth = 1.5;\n context.strokeStyle = parts.colors.background;\n context.stroke(path);\n\n if (label) {\n const size = LABEL_FONT_SIZE[Math.min(label.length, LABEL_FONT_SIZE.length - 1)]!;\n context.font = `700 ${size}px ${parts.font}`;\n context.fillStyle = parts.colors.onColor;\n context.textAlign = 'center';\n context.textBaseline = 'middle';\n context.fillText(label, PIN_HEAD.x, PIN_HEAD.y + 0.5, PIN_WIDTH - 4);\n } else {\n context.beginPath();\n context.arc(PIN_HEAD.x, PIN_HEAD.y, PIN_HEAD.radius, 0, Math.PI * 2);\n context.fillStyle = parts.colors.background;\n context.fill();\n }\n context.restore();\n}\n\nfunction drawCluster(\n context: CanvasRenderingContext2D,\n mark: Extract<MarkerMark, { kind: 'cluster' }> & { point: MapPoint },\n parts: MapImageParts,\n ratio: number,\n): void {\n const height = CLUSTER_DIAMETER[mark.size];\n context.save();\n context.font = `600 ${mark.size === 'large' ? 14 : 12}px ${parts.font}`;\n const width = Math.max(height, context.measureText(mark.text).width + 16);\n const left = mark.point.x - width / 2;\n const top = mark.point.y - height / 2;\n\n context.beginPath();\n context.roundRect(left, top, width, height, height / 2);\n withShadow(context, ratio, 2, () => {\n context.fillStyle = mark.color;\n context.fill();\n });\n context.lineWidth = 2;\n context.strokeStyle = parts.colors.background;\n context.stroke();\n\n context.fillStyle = parts.colors.onColor;\n context.textAlign = 'center';\n context.textBaseline = 'middle';\n context.fillText(mark.text, mark.point.x, mark.point.y + 0.5);\n context.restore();\n}\n\n// The legend over the bottom left corner: each color's dot and label, wrapped onto further lines\n// within the map's width.\nfunction drawLegend(context: CanvasRenderingContext2D, legend: readonly MapLegendEntry[], parts: MapImageParts): void {\n const dot = 10;\n const gap = 4;\n const itemGap = 12;\n const lineHeight = 16;\n const padding = { x: 8, y: 4 };\n const maxWidth = parts.width - 2 * CORNER_MARGIN - 2 * padding.x;\n\n context.save();\n context.font = `400 12px ${parts.font}`;\n const lines: { label: string; color: string; width: number }[][] = [[]];\n let lineWidth = 0;\n for (const entry of legend) {\n const width = dot + gap + context.measureText(entry.label).width;\n const line = lines.at(-1)!;\n if (line.length && lineWidth + itemGap + width > maxWidth) {\n lines.push([]);\n lineWidth = 0;\n }\n lines.at(-1)!.push({ ...entry, width });\n lineWidth += (lines.at(-1)!.length > 1 ? itemGap : 0) + width;\n }\n\n const widest = Math.max(...lines.map((line) => line.reduce((sum, item, index) => sum + item.width + (index ? itemGap : 0), 0)));\n const boxWidth = Math.min(widest, maxWidth) + 2 * padding.x;\n const boxHeight = lines.length * lineHeight + 2 * padding.y;\n const left = CORNER_MARGIN;\n const top = parts.height - CORNER_MARGIN - boxHeight;\n\n context.beginPath();\n context.roundRect(left, top, boxWidth, boxHeight, 4);\n context.fillStyle = parts.colors.background;\n context.fill();\n\n context.textBaseline = 'middle';\n lines.forEach((line, row) => {\n let x = left + padding.x;\n const y = top + padding.y + row * lineHeight + lineHeight / 2;\n for (const item of line) {\n context.beginPath();\n context.arc(x + dot / 2, y, dot / 2, 0, Math.PI * 2);\n context.fillStyle = item.color;\n context.fill();\n context.fillStyle = parts.colors.foreground;\n context.fillText(item.label, x + dot + gap, y + 0.5, Math.max(0, left + boxWidth - padding.x - (x + dot + gap)));\n x += item.width + itemGap;\n }\n });\n context.restore();\n}\n\n// The provider's attribution over the bottom right corner, as its own control shows it there, on\n// as many lines as the map's width needs: its terms ask for all of it.\nfunction drawAttribution(context: CanvasRenderingContext2D, text: string, parts: MapImageParts): void {\n const padding = { x: 5, y: 2 };\n const lineHeight = 13;\n context.save();\n context.font = `400 10px ${parts.font}`;\n const maxWidth = parts.width - 2 * CORNER_MARGIN - 2 * padding.x;\n\n const lines: string[] = [];\n for (const word of text.split(/\\s+/).filter(Boolean)) {\n const last = lines.at(-1);\n if (last !== undefined && context.measureText(`${last} ${word}`).width <= maxWidth) lines[lines.length - 1] = `${last} ${word}`;\n else lines.push(word);\n }\n const width = Math.min(maxWidth, Math.max(...lines.map((line) => context.measureText(line).width))) + 2 * padding.x;\n const height = lines.length * lineHeight + 2 * padding.y;\n const left = parts.width - CORNER_MARGIN / 2 - width;\n const top = parts.height - CORNER_MARGIN / 2 - height;\n\n context.globalAlpha = 0.85;\n context.fillStyle = parts.colors.background;\n context.fillRect(left, top, width, height);\n context.globalAlpha = 1;\n context.fillStyle = parts.colors.foreground;\n context.textAlign = 'right';\n context.textBaseline = 'middle';\n lines.forEach((line, index) =>\n context.fillText(line, left + width - padding.x, top + padding.y + index * lineHeight + lineHeight / 2, maxWidth),\n );\n context.restore();\n}\n\n// The popup's card, as the page draws it: as wide as its content within the page's limits, centered\n// above its point and kept inside the map, its title over its lines, its fields or the items it lists.\nconst POPUP = { minWidth: 200, maxWidth: 340, maxHeight: 360, padding: { x: 16, y: 12 }, radius: 12, gap: 8, columnGap: 12 };\nconst POPUP_TITLE = { size: 14, lineHeight: 20, maxLines: 3 };\nconst POPUP_FIELD = { size: 12, lineHeight: 16, maxLines: 3 };\nconst POPUP_ITEM = { size: 13, lineHeight: 24 };\n\nfunction drawPopup(\n context: CanvasRenderingContext2D,\n popup: NonNullable<MapImageParts['popup']>,\n parts: MapImageParts,\n ratio: number,\n): void {\n if (popup.snapshot) {\n const { image, left, top, width, height } = popup.snapshot;\n context.drawImage(image, left, top, width, height);\n return;\n }\n const { content } = popup;\n const inner = POPUP.maxWidth - 2 * POPUP.padding.x;\n const fonts = {\n title: `600 ${POPUP_TITLE.size}px ${parts.font}`,\n field: `400 ${POPUP_FIELD.size}px ${parts.font}`,\n item: `400 ${POPUP_ITEM.size}px ${parts.font}`,\n };\n context.save();\n\n context.font = fonts.title;\n const title = content.title ? wrapText(context, content.title, inner, POPUP_TITLE.maxLines) : [];\n let used = Math.max(0, ...title.map((line) => context.measureText(line).width));\n\n // Its lines of text, each wrapped across the card.\n context.font = fonts.field;\n let text = (content.lines ?? []).filter((line) => line.trim()).flatMap((line) => wrapText(context, line, inner, POPUP_FIELD.maxLines));\n if (text.length) used = Math.max(used, ...text.map((line) => context.measureText(line).width));\n\n // The fields in two columns, in the same font: the names no wider than two fifths of the card, the\n // values wrapped.\n const details = (content.details ?? []).filter((detail) => detail.value.trim());\n const labelWidth = Math.min(inner * 0.4, Math.max(0, ...details.map((detail) => context.measureText(detail.label).width)));\n const valueWidth = inner - labelWidth - POPUP.columnGap;\n const rows = details.map((detail) => ({\n label: fitText(context, detail.label, labelWidth),\n lines: wrapText(context, detail.value, valueWidth, POPUP_FIELD.maxLines),\n }));\n if (rows.length) {\n const widest = Math.max(...rows.flatMap((row) => row.lines.map((line) => context.measureText(line).width)));\n used = Math.max(used, labelWidth + POPUP.columnGap + widest);\n }\n\n context.font = fonts.item;\n let items = (content.items ?? []).map((item) => fitText(context, item, inner));\n if (items.length) used = Math.max(used, ...items.map((item) => context.measureText(item).width));\n\n // No taller than the page's popup, which scrolls past that: what doesn't fit is cut short, its last\n // line ending with an ellipsis.\n let room = POPUP.maxHeight - 2 * POPUP.padding.y - title.length * POPUP_TITLE.lineHeight;\n context.font = fonts.field;\n let cut = false;\n if (text.length && title.length) room -= POPUP.gap;\n const textFit = Math.max(0, Math.floor(room / POPUP_FIELD.lineHeight));\n if (text.length > textFit) {\n cut = true;\n text = text.slice(0, textFit);\n if (text.length) text[text.length - 1] = fitText(context, text.at(-1)!, inner, true);\n }\n room -= text.length * POPUP_FIELD.lineHeight;\n if (cut) rows.length = 0;\n if (rows.length && (title.length || text.length)) room -= POPUP.gap;\n for (let index = 0; index < rows.length && !cut; index++) {\n const row = rows[index]!;\n const fit = Math.min(row.lines.length, Math.floor(room / POPUP_FIELD.lineHeight));\n if (fit < row.lines.length) {\n cut = true;\n row.lines = row.lines.slice(0, fit);\n rows.length = fit > 0 ? index + 1 : index;\n }\n room -= fit * POPUP_FIELD.lineHeight;\n }\n if (cut) {\n const last = rows.at(-1);\n if (last) last.lines[last.lines.length - 1] = fitText(context, last.lines.at(-1)!, valueWidth, true);\n items = [];\n }\n if (items.length && (title.length || text.length || rows.length)) room -= POPUP.gap;\n const itemsFit = Math.max(0, Math.floor(room / POPUP_ITEM.lineHeight));\n if (items.length > itemsFit) items = itemsFit > 0 ? [...items.slice(0, itemsFit - 1), '…'] : [];\n\n const sections = [title.length, text.length, rows.length, items.length].filter(Boolean).length;\n if (sections === 0) {\n context.restore();\n return;\n }\n const width = Math.min(POPUP.maxWidth, Math.max(POPUP.minWidth, used + 2 * POPUP.padding.x));\n const height =\n 2 * POPUP.padding.y +\n title.length * POPUP_TITLE.lineHeight +\n text.length * POPUP_FIELD.lineHeight +\n rows.reduce((sum, row) => sum + row.lines.length * POPUP_FIELD.lineHeight, 0) +\n items.length * POPUP_ITEM.lineHeight +\n (sections - 1) * POPUP.gap;\n const left = Math.max(CORNER_MARGIN, Math.min(parts.width - CORNER_MARGIN - width, popup.point.x - width / 2));\n const top = Math.max(CORNER_MARGIN, popup.point.y - popup.offset - height);\n\n context.beginPath();\n context.roundRect(left, top, width, height, POPUP.radius);\n withShadow(context, ratio, 10, () => {\n context.fillStyle = parts.colors.background;\n context.fill();\n });\n context.lineWidth = 1;\n context.strokeStyle = parts.colors.stroke;\n context.stroke();\n\n context.textBaseline = 'middle';\n const x = left + POPUP.padding.x;\n let y = top + POPUP.padding.y;\n context.fillStyle = parts.colors.foreground;\n context.font = fonts.title;\n for (const line of title) {\n context.fillText(line, x, y + POPUP_TITLE.lineHeight / 2);\n y += POPUP_TITLE.lineHeight;\n }\n if (title.length && (text.length || rows.length || items.length)) y += POPUP.gap;\n\n context.font = fonts.field;\n for (const line of text) {\n context.fillText(line, x, y + POPUP_FIELD.lineHeight / 2);\n y += POPUP_FIELD.lineHeight;\n }\n if (text.length && (rows.length || items.length)) y += POPUP.gap;\n\n for (const row of rows) {\n context.fillStyle = parts.colors.secondary;\n context.fillText(row.label, x, y + POPUP_FIELD.lineHeight / 2);\n context.fillStyle = parts.colors.foreground;\n for (const line of row.lines) {\n context.fillText(line, x + labelWidth + POPUP.columnGap, y + POPUP_FIELD.lineHeight / 2);\n y += POPUP_FIELD.lineHeight;\n }\n }\n if (rows.length && items.length) y += POPUP.gap;\n\n context.font = fonts.item;\n context.fillStyle = parts.colors.foreground;\n for (const item of items) {\n context.fillText(item, x, y + POPUP_ITEM.lineHeight / 2);\n y += POPUP_ITEM.lineHeight;\n }\n context.restore();\n}\n\n// `text` on lines no wider than `maxWidth` in the context's font, broken between words — or inside a\n// word too long for a line — and cut short with an ellipsis past `maxLines`.\nfunction wrapText(context: CanvasRenderingContext2D, text: string, maxWidth: number, maxLines: number): string[] {\n const lines: string[] = [];\n // The lines a word too long for one runs on from.\n const runsOn = new Set<number>();\n let line = '';\n for (const word of text.split(/\\s+/).filter(Boolean)) {\n const joined = line ? `${line} ${word}` : word;\n if (context.measureText(joined).width <= maxWidth) {\n line = joined;\n continue;\n }\n if (line) lines.push(line);\n // A word wider than a line is broken where it reaches the edge.\n let rest = word;\n while (rest.length > 1 && context.measureText(rest).width > maxWidth) {\n let end = rest.length - 1;\n while (end > 1 && context.measureText(rest.slice(0, end)).width > maxWidth) end--;\n lines.push(rest.slice(0, end));\n runsOn.add(lines.length - 1);\n rest = rest.slice(end);\n }\n line = rest;\n }\n if (line) lines.push(line);\n if (lines.length <= maxLines) return lines;\n const kept = lines.slice(0, maxLines);\n const joiner = runsOn.has(maxLines - 1) ? '' : ' ';\n kept[maxLines - 1] = fitText(context, `${kept[maxLines - 1]}${joiner}${lines[maxLines]}`, maxWidth, true);\n return kept;\n}\n\n// `text` cut short with an ellipsis to fit `maxWidth` — or, with `cut`, cut short whether it fits or not.\nfunction fitText(context: CanvasRenderingContext2D, text: string, maxWidth: number, cut = false): string {\n if (!cut && context.measureText(text).width <= maxWidth) return text;\n let end = text.length;\n while (end > 0 && context.measureText(`${text.slice(0, end).trimEnd()}…`).width > maxWidth) end--;\n return `${text.slice(0, end).trimEnd()}…`;\n}\n\n/** Hands the image to the browser to save, under `fileName`. */\nexport async function saveCanvas(canvas: HTMLCanvasElement, fileName: string): Promise<void> {\n const blob = await canvasBlob(canvas);\n const document = canvas.ownerDocument;\n const url = URL.createObjectURL(blob);\n const link = document.createElement('a');\n link.href = url;\n link.download = fileName;\n link.style.display = 'none';\n document.body.appendChild(link);\n link.click();\n link.remove();\n // Once the browser has started the download.\n setTimeout(() => URL.revokeObjectURL(url), 60_000);\n}\n\nexport function canvasBlob(canvas: HTMLCanvasElement): Promise<Blob> {\n return new Promise((resolve, reject) =>\n canvas.toBlob((blob) => (blob ? resolve(blob) : reject(new Error(\"The map's image couldn't be made.\"))), 'image/png'),\n );\n}\n\n/** What is printed with the map, its colors resolved. */\nexport interface MapPrintSheet extends MapPrintOptions {\n /** The page's language, as a culture name such as `en-US`. */\n language: string;\n /** The page's font family. */\n font: string;\n /** Text on a pin's badge. */\n onColor: string;\n /** A badge with no color of its own. */\n badgeColor: string;\n}\n\n// The printout's own looks. Paper is light whatever the portal's theme, so its colors are the\n// browser's own for a light page, not the theme's tokens: a dark theme's would print light text on\n// white.\nconst PRINT_SHEET_CSS = `\n.ppp-map-print-sheet { color-scheme: light; color: CanvasText; font-size: 10pt; line-height: 1.35; print-color-adjust: exact; -webkit-print-color-adjust: exact; }\n.ppp-map-print-title { margin: 0 0 8pt; font-size: 15pt; font-weight: 600; }\n.ppp-map-print-image { display: block; width: 100%; height: auto; break-inside: avoid; }\n.ppp-map-print-entries { list-style: none; margin: 10pt 0 0; padding: 0; columns: 2 220pt; column-gap: 18pt; }\n.ppp-map-print-entry { display: flex; gap: 8pt; padding: 4pt 0; border-bottom: 0.5pt solid GrayText; break-inside: avoid; }\n.ppp-map-print-badge {\n flex: none; display: flex; align-items: center; justify-content: center; box-sizing: border-box;\n min-width: 18pt; height: 18pt; padding: 0 4pt; border-radius: 9pt; font-size: 8pt; font-weight: 700;\n}\n.ppp-map-print-bullet { flex: none; width: 8pt; height: 8pt; margin-top: 3pt; border-radius: 4pt; }\n.ppp-map-print-name { font-weight: 600; overflow-wrap: anywhere; }\n.ppp-map-print-details { display: grid; grid-template-columns: auto 1fr; column-gap: 6pt; margin: 1pt 0 0; font-size: 8.5pt; }\n.ppp-map-print-details dt { color: GrayText; }\n.ppp-map-print-details dd { margin: 0; overflow-wrap: anywhere; }\n`;\n\n// The printout's heading.\nfunction titleElement(document: Document, sheet: MapPrintSheet): HTMLElement | null {\n if (!sheet.title?.trim()) return null;\n const heading = document.createElement('h1');\n heading.className = 'ppp-map-print-title';\n heading.textContent = sheet.title.trim();\n return heading;\n}\n\n// The records listed under the map, each beside its pin's label in its color.\nfunction entriesElement(document: Document, sheet: MapPrintSheet): HTMLElement | null {\n if (!sheet.entries?.length) return null;\n const list = document.createElement('ol');\n list.className = 'ppp-map-print-entries';\n for (const entry of sheet.entries) {\n const item = document.createElement('li');\n item.className = 'ppp-map-print-entry';\n\n const badge = document.createElement('span');\n badge.style.backgroundColor = entry.color || sheet.badgeColor;\n if (entry.label) {\n badge.className = 'ppp-map-print-badge';\n badge.style.color = sheet.onColor;\n badge.textContent = entry.label;\n } else {\n badge.className = 'ppp-map-print-bullet';\n }\n item.appendChild(badge);\n\n const body = document.createElement('div');\n const name = document.createElement('div');\n name.className = 'ppp-map-print-name';\n name.textContent = entry.title;\n body.appendChild(name);\n const details = (entry.details ?? []).filter((detail) => detail.value.trim());\n if (details.length) {\n const list = document.createElement('dl');\n list.className = 'ppp-map-print-details';\n for (const detail of details) {\n const term = document.createElement('dt');\n term.textContent = detail.label;\n const value = document.createElement('dd');\n value.textContent = detail.value;\n list.append(term, value);\n }\n body.appendChild(list);\n }\n item.appendChild(body);\n list.appendChild(item);\n }\n return list;\n}\n\n/**\n * Prints the map's image with its heading and records, in a frame of its own: the page isn't laid\n * out again for paper, so the map on it doesn't move. The frame stays until the browser has printed,\n * or the next printout replaces it.\n */\nexport async function printImage(ownerDocument: Document, image: Blob, sheet: MapPrintSheet): Promise<void> {\n for (const old of ownerDocument.querySelectorAll<HTMLIFrameElement>('iframe.ppp-map-print-frame')) removeFrame(old);\n\n const frame = ownerDocument.createElement('iframe');\n frame.className = 'ppp-map-print-frame';\n frame.setAttribute('aria-hidden', 'true');\n frame.tabIndex = -1;\n // Not hidden: a browser prints a hidden frame blank.\n frame.style.cssText = 'position: fixed; right: 0; bottom: 0; width: 0; height: 0; border: 0;';\n const url = URL.createObjectURL(image);\n frame.dataset.url = url;\n ownerDocument.body.appendChild(frame);\n\n const window = frame.contentWindow;\n const document = frame.contentDocument;\n if (!window || !document) {\n removeFrame(frame);\n throw new Error(\"The map couldn't be printed.\");\n }\n\n document.documentElement.lang = sheet.language;\n if (ownerDocument.documentElement.dir) document.documentElement.dir = ownerDocument.documentElement.dir;\n document.title = sheet.title?.trim() || ownerDocument.title;\n const style = document.createElement('style');\n style.textContent = `@page { margin: 12mm; } body { margin: 0; font-family: ${sheet.font}; }${PRINT_SHEET_CSS}`;\n document.head.appendChild(style);\n\n const body = document.createElement('div');\n body.className = 'ppp-map-print-sheet';\n const heading = titleElement(document, sheet);\n if (heading) body.appendChild(heading);\n const img = document.createElement('img');\n img.className = 'ppp-map-print-image';\n img.alt = sheet.title?.trim() ?? '';\n img.src = url;\n body.appendChild(img);\n const entries = entriesElement(document, sheet);\n if (entries) body.appendChild(entries);\n document.body.appendChild(body);\n\n // Printed once the image is in; one that fails to decode is printed as the browser has it.\n if (typeof img.decode === 'function') await img.decode().catch(() => undefined);\n window.addEventListener('afterprint', () => removeFrame(frame), { once: true });\n window.focus();\n window.print();\n}\n\nfunction removeFrame(frame: HTMLIFrameElement): void {\n if (frame.dataset.url) URL.revokeObjectURL(frame.dataset.url);\n frame.remove();\n}\n\n// What a map printed on the page wider than paper is shrunk to, in CSS pixels: an A4 or Letter\n// page's width inside a printer's margins.\nconst PAPER_WIDTH = 680;\n\n/**\n * Prints the map as it is on the page — for a provider whose map can't be copied into an image —\n * with its heading above it and its records under it, every other element of the page left out of\n * the printout. The map keeps the size it has, shrunk to the paper's width, so its view doesn't\n * change; the page is as it was once the browser has printed.\n */\nexport function printPage(target: HTMLElement, sheet: MapPrintSheet): void {\n const document = target.ownerDocument;\n const window = document.defaultView;\n if (!window) throw new Error(\"The map couldn't be printed.\");\n ensureStyleSheet(document, 'ppp-map-print-styles', `@media print { ${PRINT_SHEET_CSS} }`);\n\n const path: Element[] = [];\n for (let element = target.parentElement; element && element !== document.documentElement; element = element.parentElement) {\n element.setAttribute('data-ppp-map-print-path', '');\n path.push(element);\n }\n\n const { width, height } = target.getBoundingClientRect();\n const style = { width: target.style.width, height: target.style.height };\n const scale = width > PAPER_WIDTH ? PAPER_WIDTH / width : 1;\n // Fixed at its size, so paper's width doesn't draw it again; shrunk to fit, the space it leaves\n // taken back.\n target.style.width = `${width}px`;\n target.style.height = `${height}px`;\n target.classList.add('ppp-map-print-target');\n const printStyle = document.createElement('style');\n printStyle.textContent =\n `@media print { html.ppp-map-printing .ppp-map-print-target { transform: scale(${scale}); transform-origin: top left; ` +\n `margin-bottom: ${height * (scale - 1)}px !important; } }`;\n document.head.appendChild(printStyle);\n\n const sheets: HTMLElement[] = [];\n const heading = titleElement(document, sheet);\n if (heading) sheets.push(wrapSheet(document, heading, (element) => target.before(element)));\n const entries = entriesElement(document, sheet);\n if (entries) sheets.push(wrapSheet(document, entries, (element) => target.after(element)));\n document.documentElement.classList.add('ppp-map-printing');\n\n const restore = () => {\n document.documentElement.classList.remove('ppp-map-printing');\n for (const element of path) element.removeAttribute('data-ppp-map-print-path');\n for (const element of sheets) element.remove();\n printStyle.remove();\n target.classList.remove('ppp-map-print-target');\n target.style.width = style.width;\n target.style.height = style.height;\n };\n window.addEventListener('afterprint', restore, { once: true });\n window.print();\n}\n\nfunction wrapSheet(document: Document, content: HTMLElement, place: (element: HTMLElement) => void): HTMLElement {\n const sheet = document.createElement('div');\n sheet.className = 'ppp-map-print-sheet';\n sheet.setAttribute('aria-hidden', 'true');\n sheet.appendChild(content);\n place(sheet);\n return sheet;\n}\n","export type {\n MapAddressSuggestion,\n MapBounds,\n MapCamera,\n MapCircle,\n MapClickEvent,\n MapItem,\n MapItemClickEvent,\n MapLegendEntry,\n MapMarker,\n MapPrintEntry,\n MapPrintOptions,\n MapPrintPopup,\n MapPlace,\n MapPoint,\n MapPolygon,\n MapPolyline,\n MapPosition,\n MapShape,\n MapStyle,\n MapView,\n} from './types.js';\nexport type {\n AzureMapsAccessToken,\n AzureMapsSettings,\n CustomMapProviderSettings,\n EsriSettings,\n GoogleSettings,\n MapAddressQuery,\n MapGeocoder,\n MapGestureHelp,\n MapLibreSettings,\n MapOverlay,\n MapProvider,\n MapProviderKeys,\n MapProviderSettings,\n MapSurface,\n MapSurfaceContext,\n MapSurfaceEvents,\n OpenStreetMapSettings,\n} from './provider.js';\nexport { BUILT_IN_MAP_PROVIDERS, findMapProvider, registerMapProvider } from './registry.js';\nexport {\n PortalMapSettingsCache,\n resolveProviderSettings,\n type PortalMapSettings,\n type PortalMapSettingsLoader,\n} from './portal-settings.js';\nexport {\n FIT_MAX_ZOOM,\n FIT_PADDING,\n MapController,\n PLACE_ZOOM,\n WORLD_CAMERA,\n type AddressSearchOptions,\n type MapAddressStatus,\n type MapControllerEvents,\n type MapControllerOptions,\n type MapErrorKind,\n} from './map-controller.js';\nexport {\n approximateBounds,\n boundsContain,\n boundsOf,\n boundsOfItems,\n circlePath,\n destination,\n isValidPosition,\n itemPositions,\n padBounds,\n toBoundingBox,\n wrapLongitude,\n} from './geo.js';\nexport { CLUSTER_MAX_ZOOM, MarkerLayer, type MarkerLayerOptions } from './markers.js';\nexport {\n DEFAULT_NEAR_DISTANCE,\n DEFAULT_NEAR_DISTANCES,\n DistanceUnits,\n formatDistance,\n locate,\n metersPer,\n mountPlaceSearch,\n placeFinder,\n sameNearPlace,\n type DistanceUnit,\n type NearPlace,\n type PlaceSearchOptions,\n} from './near.js';\nexport {\n AddressSearchBox,\n MIN_SUGGEST_LENGTH,\n SUGGEST_DELAY,\n type AddressSearchHost,\n type AddressSearchLabels,\n} from './address-search.js';\nexport {\n AZURE_MAPS_GEOCODE_API_VERSION,\n ESRI_GEOCODE_ENDPOINT,\n NOMINATIM_URL,\n SUGGESTION_COUNT,\n azureMapsGeocoder,\n esriGeocoder,\n nominatimGeocoder,\n splitLabel,\n} from './geocoders.js';\nexport { DEFAULT_ITEM_COLOR, isDarkTheme, resolveColor, watchTheme } from './theme.js';\nexport { ensureMapStyles, ensureStyleSheet, MAP_CSS } from './styles.js';\nexport { mapLibreWorkerUrl, setMapLibreWorkerUrl } from './maplibre-worker.js';\n","import { AddressSearchBox, type AddressSearchLabels } from './address-search.js';\nimport { azureMapsGeocoder, esriGeocoder, nominatimGeocoder } from './geocoders.js';\nimport type {\n AzureMapsAccessToken,\n AzureMapsSettings,\n MapGeocoder,\n MapLibreSettings,\n MapProviderKeys,\n MapProviderSettings,\n OpenStreetMapSettings,\n} from './provider.js';\nimport { AZURE_MAPS_ENDPOINT, azureMapsHeaders } from './providers/basemaps.js';\nimport { ensureMapStyles, ensureStyleSheet } from './styles.js';\nimport type { MapPlace, MapPosition, MapView } from './types.js';\n\n/** A unit distances are measured in, as the server numbers them: miles, or kilometers. */\nexport const DistanceUnits = { Miles: 0, Kilometers: 1 } as const;\nexport type DistanceUnit = (typeof DistanceUnits)[keyof typeof DistanceUnits];\n\n/** The distances a search near a place offers, unless its page gives others. */\nexport const DEFAULT_NEAR_DISTANCES: readonly number[] = Object.freeze([1, 5, 10, 25, 50, 100]);\n\n/** The distance a search near a place starts at, unless its page gives another. */\nexport const DEFAULT_NEAR_DISTANCE = 25;\n\n/** Where a search near a place is, and how far from it records may be. */\nexport interface NearPlace {\n /** The place as it was found: an address, or the visitor's location. */\n label: string;\n latitude: number;\n longitude: number;\n distance: number;\n unit: DistanceUnit;\n}\n\n/** Meters in a unit. */\nexport function metersPer(unit: DistanceUnit): number {\n return unit === DistanceUnits.Kilometers ? 1000 : 1609.344;\n}\n\n/** A distance as a number to show: to a tenth under ten, whole past it. */\nexport function formatDistance(value: number, language: string): string {\n return value.toLocaleString(language, { maximumFractionDigits: value < 10 ? 1 : 0 });\n}\n\n/**\n * Whether two searches near a place are the same: the same place, distance and unit. The label\n * isn't compared — the same place found twice may be written differently.\n */\nexport function sameNearPlace(a: NearPlace | null | undefined, b: NearPlace | null | undefined): boolean {\n if (!a || !b) return !a && !b;\n return a.latitude === b.latitude && a.longitude === b.longitude && a.distance === b.distance && a.unit === b.unit;\n}\n\n// Asked of a geocoder without a map: the whole world, so no part of it comes first.\nconst WORLD_VIEW: MapView = {\n center: { latitude: 0, longitude: 0 },\n zoom: 1,\n bounds: { north: 85, south: -85, east: 180, west: -180 },\n};\n\n/**\n * The portal's map provider's address search, for finding a place without a map: Azure Maps' with\n * the portal's token, Esri's with its key, Google's Places, or a Nominatim server for OpenStreetMap's\n * tiles and any other style. Null for a provider of the page's own, whose search the map's alone.\n */\nexport async function placeFinder(\n settings: MapProviderSettings & MapProviderKeys,\n language: string,\n document: Document,\n): Promise<MapGeocoder | null> {\n switch (settings.name) {\n case 'azureMaps': {\n const getToken = settings.getToken;\n if (!getToken) return null;\n let token: AzureMapsAccessToken | null = null;\n // A token is asked for before the first search, and again within five minutes of its expiry.\n const signIn = async () => {\n const expiresOn = token ? Date.parse(token.expiresOn) : Number.NaN;\n if (!token || (Number.isFinite(expiresOn) && expiresOn - Date.now() < 5 * 60_000)) token = await getToken();\n };\n const search = azureMapsGeocoder(AZURE_MAPS_ENDPOINT, () => azureMapsHeaders(token), (settings as AzureMapsSettings).view);\n return {\n suggestsAsYouType: search.suggestsAsYouType,\n suggest: async (query) => {\n await signIn();\n return search.suggest(query);\n },\n resolve: async (suggestion, signal) => {\n await signIn();\n return search.resolve(suggestion, signal);\n },\n };\n }\n case 'esri':\n return esriGeocoder(settings.apiKey ?? '');\n case 'google': {\n const { googlePlaceFinder } = await import(/* webpackChunkName: \"google\" */ './providers/google.js');\n return googlePlaceFinder(settings.apiKey ?? '', language, document);\n }\n case 'openStreetMap':\n case 'mapLibre':\n return nominatimGeocoder((settings as OpenStreetMapSettings | MapLibreSettings).geocoderUrl || undefined);\n default:\n return null;\n }\n}\n\n/**\n * The visitor's location, from the browser: it asks them first. Fails when they say no, the browser\n * can't tell, or it takes more than fifteen seconds.\n */\nexport function locate(navigator: Navigator = globalThis.navigator): Promise<MapPosition> {\n return new Promise((resolve, reject) => {\n if (!navigator?.geolocation) {\n reject(new Error(\"The browser can't tell where it is.\"));\n return;\n }\n navigator.geolocation.getCurrentPosition(\n ({ coords }) => resolve({ latitude: coords.latitude, longitude: coords.longitude }),\n (error) => reject(new Error(error.message)),\n { enableHighAccuracy: false, timeout: 15_000, maximumAge: 60_000 },\n );\n });\n}\n\nconst NEAR_CSS = `\n.ppp-near-place-search.ppp-map-search { position: relative; top: auto; left: auto; z-index: auto; width: 100%; }\n.ppp-near-place-search .ppp-map-search-field { box-shadow: none; }\n.ppp-near-place-search .ppp-map-search-panel { position: absolute; left: 0; right: 0; z-index: 1; }\n`;\n\n/** What a place search outside a map tells its page. */\nexport interface PlaceSearchOptions {\n /** The provider's address search; without one the box shows nothing found for whatever is typed. */\n finder: MapGeocoder | null;\n language: string;\n /** ISO 3166-1 two-letter country codes the places are limited to; anywhere when empty. */\n countries?: readonly string[];\n labels: AddressSearchLabels;\n /** A place was chosen. */\n chosen(place: MapPlace): void;\n /** The box was cleared. */\n cleared?(): void;\n}\n\n/**\n * The map's address search, drawn into `container` rather than over a map — the box a search near a\n * place finds its place with, on both stacks. Disposed, it takes itself out.\n */\nexport function mountPlaceSearch(container: HTMLElement, options: PlaceSearchOptions): AddressSearchBox {\n const document = container.ownerDocument;\n // The box's own look is the map's, which may not be on the page.\n ensureMapStyles(document);\n ensureStyleSheet(document, 'ppp-near-styles', NEAR_CSS);\n const { finder } = options;\n const box = new AddressSearchBox(\n document,\n {\n suggestsAsYouType: () => finder?.suggestsAsYouType ?? false,\n suggest: (text, signal) =>\n finder\n ? finder.suggest({ text, view: WORLD_VIEW, countries: options.countries ?? [], language: options.language, signal })\n : Promise.resolve([]),\n choose: async (suggestion) => {\n const place = finder ? await finder.resolve(suggestion) : null;\n if (!place) return false;\n options.chosen(place);\n return true;\n },\n clear: () => options.cleared?.(),\n },\n options.labels,\n );\n box.element.classList.add('ppp-near-place-search');\n container.appendChild(box.element);\n return box;\n}\n","import type { PowerPortalsProClient } from '@powerportalspro/core';\nimport { PortalMapSettingsCache } from './core/index.js';\n\n// The portal's map settings, shared by every map of the portal's client on the page.\nconst portalSettingsCaches = new WeakMap<PowerPortalsProClient, PortalMapSettingsCache>();\n\n/** The portal's map settings, shared by the client's maps and its searches near a place. */\nexport function portalSettingsCache(ppp: PowerPortalsProClient): PortalMapSettingsCache {\n let cache = portalSettingsCaches.get(ppp);\n if (!cache) portalSettingsCaches.set(ppp, (cache = new PortalMapSettingsCache()));\n return cache;\n}\n","import {\n Button,\n Dropdown,\n Field,\n Label,\n makeStyles,\n mergeClasses,\n Option,\n Popover,\n PopoverSurface,\n PopoverTrigger,\n Spinner,\n Text,\n tokens,\n Tooltip,\n} from '@fluentui/react-components';\nimport { Dismiss16Regular, Location24Filled, Location24Regular, MyLocation20Regular } from '@fluentui/react-icons';\nimport { useLocale, usePowerPortalsPro, usePrefixedT } from '@powerportalspro/react';\nimport { useEffect, useRef, useState } from 'react';\nimport {\n DEFAULT_NEAR_DISTANCE,\n DEFAULT_NEAR_DISTANCES,\n DistanceUnits,\n formatDistance,\n locate,\n metersPer,\n mountPlaceSearch,\n placeFinder,\n resolveProviderSettings,\n type DistanceUnit,\n type MapGeocoder,\n type MapItem,\n type MapProviderSettings,\n type NearPlace,\n} from './core/index.js';\nimport { portalSettingsCache } from './portal-settings-cache.js';\n\nconst useStyles = makeStyles({\n surface: {\n display: 'flex',\n flexDirection: 'column',\n rowGap: tokens.spacingVerticalM,\n width: `min(340px, calc(100vw - ${tokens.spacingHorizontalXXXL}))`,\n boxSizing: 'border-box',\n },\n location: {\n display: 'flex',\n alignItems: 'center',\n columnGap: tokens.spacingHorizontalS,\n flexWrap: 'wrap',\n },\n failure: {\n color: tokens.colorPaletteRedForeground1,\n },\n measures: {\n display: 'grid',\n gridTemplateColumns: '1fr 1fr',\n columnGap: tokens.spacingHorizontalM,\n },\n dropdown: {\n minWidth: 0,\n },\n actions: {\n display: 'flex',\n justifyContent: 'flex-end',\n },\n});\n\n/** What a search near a place shows and changes. */\nexport interface NearSearchProps {\n /** The place searched near, and how far from it; null when the search isn't near anywhere. */\n value: NearPlace | null;\n /** A place was chosen, the distance or unit changed, or the search was cleared (null). */\n onChange: (value: NearPlace | null) => void;\n /** The distances offered. Default 1, 5, 10, 25, 50 and 100. */\n distances?: readonly number[] | undefined;\n /** The distance offered first, before one is chosen. Default 25, or the first offered when 25 isn't. */\n defaultDistance?: number | undefined;\n /** The unit offered first, before one is chosen. Default miles. */\n defaultUnit?: DistanceUnit | undefined;\n /** Whose address search finds the place: the portal's own map provider unless set. */\n provider?: MapProviderSettings | undefined;\n /** ISO 3166-1 two-letter country codes the places found are limited to; anywhere when unset. */\n countries?: readonly string[] | undefined;\n className?: string | undefined;\n}\n\n/**\n * What the id of the circle a search near a place draws starts with: a click inside it is a click on\n * the map. The rest of the id is the place and distance, so a map kept on it is fitted to each new one.\n */\nexport const NEAR_CIRCLE_ID = 'ppp-near-circle';\n\n/** The id of the circle drawn for a search near a place. */\nexport function nearCircleId(near: NearPlace): string {\n return `${NEAR_CIRCLE_ID}:${near.latitude},${near.longitude},${near.distance},${near.unit}`;\n}\n\n/** The color of the circle a search near a place draws, and of its place's pin. */\nexport const NEAR_COLOR = 'var(--colorPaletteRedBackground3, #d13438)';\n\n/**\n * What a search near a place draws on a map: the circle within its distance, and a pin at the place.\n * Blazor's `NearSearch.Items`.\n */\nexport function nearPlaceItems(near: NearPlace): MapItem[] {\n const center = { latitude: near.latitude, longitude: near.longitude };\n return [\n { kind: 'circle', id: nearCircleId(near), center, radius: near.distance * metersPer(near.unit), color: NEAR_COLOR },\n { kind: 'marker', id: 'ppp-near-place', position: center, title: near.label, color: NEAR_COLOR },\n ];\n}\n\n// Each provider's address search, found once a page: the portal's own under ''.\nconst finders = new Map<string, Promise<MapGeocoder | null>>();\n\n/**\n * Finds the records near a place: a toolbar button that opens the place's search — an address, with\n * the map provider's own search, or the visitor's location — and how far from it, in miles or\n * kilometers. Shown by a multi-table `<Map allowNearSearch>` and a grid's `allowNearSearch` (through\n * `<MapsProvider>`). The twin of Blazor's `NearSearch`.\n */\nexport function NearSearch({ value, onChange, distances, defaultDistance, defaultUnit, provider, countries, className }: NearSearchProps) {\n const styles = useStyles();\n const t = usePrefixedT('app.components.map');\n const { ppp } = usePowerPortalsPro();\n const { locale } = useLocale();\n\n const offered = distances && distances.length > 0 ? distances : DEFAULT_NEAR_DISTANCES;\n const startDistance = defaultDistance ?? (offered.includes(DEFAULT_NEAR_DISTANCE) ? DEFAULT_NEAR_DISTANCE : offered[0]!);\n const [open, setOpen] = useState(false);\n // The distance and unit chosen: the search's own while it has one, else the ones a place will take.\n const [distance, setDistance] = useState(value?.distance ?? startDistance);\n const [unit, setUnit] = useState<DistanceUnit>(value?.unit ?? defaultUnit ?? DistanceUnits.Miles);\n useEffect(() => {\n if (value) {\n setDistance(value.distance);\n setUnit(value.unit);\n }\n }, [value]);\n const [locating, setLocating] = useState(false);\n const [locationFailed, setLocationFailed] = useState(false);\n\n const distanceText = (miles: number, inUnit: DistanceUnit) =>\n t(inUnit === DistanceUnits.Kilometers ? 'distance-kilometers' : 'distance-miles', [formatDistance(miles, locale)]);\n const choices = offered.includes(distance) ? offered : [...offered, distance].sort((a, b) => a - b);\n\n // The latest of what a place found is applied with: the search box answers long after it was made.\n const latest = useRef({ distance, unit, onChange });\n latest.current = { distance, unit, onChange };\n\n // The address search, drawn into the popup by the map's own code once its provider is known.\n const boxHost = useRef<HTMLDivElement | null>(null);\n const providerKey = provider ? JSON.stringify(provider) : '';\n const countriesKey = (countries ?? []).join(',');\n const label = value?.label ?? null;\n useEffect(() => {\n const host = boxHost.current;\n if (!open || !host) return;\n let finder = finders.get(providerKey);\n if (!finder) {\n finder = resolveProviderSettings(provider, (name) => portalSettingsCache(ppp).get(name, (asked) => ppp.getMapSettingsAsync(asked)))\n .then((settings) => placeFinder(settings, locale, host.ownerDocument))\n .catch((error: unknown) => {\n finders.delete(providerKey);\n console.warn(\"[NearSearch] The map provider's address search couldn't be set up.\", error);\n return null;\n });\n finders.set(providerKey, finder);\n }\n\n let box: ReturnType<typeof mountPlaceSearch> | null = null;\n let gone = false;\n void finder.then((found) => {\n if (gone) return;\n box = mountPlaceSearch(host, {\n finder: found,\n language: locale,\n countries: countriesKey ? countriesKey.split(',') : [],\n labels: {\n placeholder: t('search-placeholder'),\n clear: t('search-clear'),\n searching: t('searching'),\n noResults: t('search-no-results'),\n failed: t('search-failed'),\n },\n chosen: (place) => {\n const { distance: chosenDistance, unit: chosenUnit, onChange: change } = latest.current;\n change({\n label: place.label,\n latitude: place.position.latitude,\n longitude: place.position.longitude,\n distance: chosenDistance,\n unit: chosenUnit,\n });\n setOpen(false);\n },\n });\n if (label) box.showChosen(label);\n });\n return () => {\n gone = true;\n box?.dispose();\n };\n // `t` is the same strings throughout; the box shows the place it opened with.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [open, ppp, providerKey, countriesKey, locale]);\n\n const findMyLocation = () => {\n setLocating(true);\n setLocationFailed(false);\n locate().then(\n (position) => {\n setLocating(false);\n onChange({ label: t('near-my-place'), ...position, distance, unit });\n setOpen(false);\n },\n () => {\n setLocating(false);\n setLocationFailed(true);\n },\n );\n };\n\n // A new distance or unit applies to the place searched near at once.\n const measure = (nextDistance: number, nextUnit: DistanceUnit) => {\n setDistance(nextDistance);\n setUnit(nextUnit);\n if (value) onChange({ ...value, distance: nextDistance, unit: nextUnit });\n };\n\n const tooltip = value ? t('near-active', [distanceText(value.distance, value.unit), value.label]) : t('near-title');\n return (\n <Popover positioning=\"below-end\" withArrow trapFocus open={open} onOpenChange={(_, data) => setOpen(data.open)}>\n <PopoverTrigger disableButtonEnhancement>\n <Tooltip content={tooltip} relationship=\"label\" withArrow>\n <Button\n className={mergeClasses('ppp-near-search', className)}\n appearance={value ? 'primary' : 'subtle'}\n icon={value ? <Location24Filled /> : <Location24Regular />}\n >\n {value ? distanceText(value.distance, value.unit) : undefined}\n </Button>\n </Tooltip>\n </PopoverTrigger>\n <PopoverSurface className={mergeClasses('ppp-near-search-panel', styles.surface)} aria-label={t('near-title')}>\n <div>\n <Label>{t('near-place')}</Label>\n <div ref={boxHost} className=\"ppp-near-search-place\" />\n </div>\n <div className={styles.location}>\n <Button appearance=\"subtle\" icon={<MyLocation20Regular />} disabled={locating} onClick={findMyLocation}>\n {t('near-my-location')}\n </Button>\n {locating && <Spinner size=\"extra-tiny\" label={t('near-locating')} />}\n </div>\n {locationFailed && (\n <Text size={200} className={styles.failure} role=\"alert\">\n {t('near-location-failed')}\n </Text>\n )}\n <div className={styles.measures}>\n <Field label={t('near-distance')}>\n <Dropdown\n className={mergeClasses('ppp-near-search-distance', styles.dropdown)}\n value={distanceText(distance, unit)}\n selectedOptions={[String(distance)]}\n onOptionSelect={(_, data) => data.optionValue && measure(Number(data.optionValue), unit)}\n >\n {choices.map((choice) => (\n <Option key={choice} value={String(choice)}>\n {distanceText(choice, unit)}\n </Option>\n ))}\n </Dropdown>\n </Field>\n <Field label={t('near-unit')}>\n <Dropdown\n className={mergeClasses('ppp-near-search-unit', styles.dropdown)}\n value={unit === DistanceUnits.Kilometers ? t('near-kilometers') : t('near-miles')}\n selectedOptions={[String(unit)]}\n onOptionSelect={(_, data) => data.optionValue && measure(distance, Number(data.optionValue) as DistanceUnit)}\n >\n <Option value={String(DistanceUnits.Miles)}>{t('near-miles')}</Option>\n <Option value={String(DistanceUnits.Kilometers)}>{t('near-kilometers')}</Option>\n </Dropdown>\n </Field>\n </div>\n {value && (\n <div className={styles.actions}>\n <Button\n className=\"ppp-near-search-clear\"\n icon={<Dismiss16Regular />}\n onClick={() => {\n onChange(null);\n setOpen(false);\n }}\n >\n {t('near-clear')}\n </Button>\n </div>\n )}\n </PopoverSurface>\n </Popover>\n );\n}\n","import {\n ColumnType,\n getRecordReferenceId,\n readColumnRawValue,\n resolveColumnDisplayValue,\n type QueryResponse,\n type MultiTablePlace,\n type ResolvedColumn,\n type TableMetadata,\n type TableRecord,\n} from '@powerportalspro/core';\nimport type { MapMarker } from './core/index.js';\n\n/**\n * The colors a column's options get when Dataverse gives them none, by the option's place in the\n * column: Fluent's palette, with its light theme's values for a page whose theme lacks one.\n */\nexport const OPTION_COLORS: readonly string[] = [\n 'var(--colorPaletteBerryBackground3, #c239b3)',\n 'var(--colorPaletteTealBackground3, #038387)',\n 'var(--colorPaletteDarkOrangeBackground3, #da3b01)',\n 'var(--colorPaletteCornflowerBackground3, #4f6bed)',\n 'var(--colorPaletteGreenBackground3, #107c10)',\n 'var(--colorPaletteMarigoldBackground3, #eaa300)',\n 'var(--colorPaletteGrapeBackground3, #881798)',\n 'var(--colorPaletteRedBackground3, #d13438)',\n 'var(--colorPaletteSteelBackground3, #005b70)',\n 'var(--colorPaletteLightGreenBackground3, #13a10e)',\n];\n\n/** The color of a row with no value in the column its markers are colored by. */\nexport const NO_VALUE_COLOR = 'var(--colorNeutralForeground4, #707070)';\n\n/** A column's options, in its order, with the color Dataverse gives each. */\nexport interface ColorOption {\n value: number;\n color?: string;\n}\n\n/** The column kinds whose options can color rows. */\nconst COLORING_COLUMNS: ReadonlySet<number> = new Set([ColumnType.Boolean, ColumnType.Choice, ColumnType.State, ColumnType.Status]);\n\n/**\n * The options of a choice, state, status reason or yes/no column, from its metadata; null for a\n * column of any other kind.\n */\nexport function colorOptions(column: TableMetadata['columns'][number] | undefined): ColorOption[] | null {\n if (!column || !COLORING_COLUMNS.has(column.$type ?? -1) || !('choices' in column) || !column.choices) return null;\n return column.choices.map((choice) => ({ value: Number(choice.value), ...(choice.color ? { color: choice.color } : {}) }));\n}\n\n/** A row's option in the column, as a number: a yes/no column's as 0 or 1. Null for none. */\nexport function optionValue(record: TableRecord, column: string): number | null {\n const value = readColumnRawValue(record, column);\n if (typeof value === 'boolean') return value ? 1 : 0;\n const number = typeof value === 'string' && value !== '' ? Number(value) : value;\n return typeof number === 'number' && Number.isFinite(number) ? number : null;\n}\n\n/**\n * An option's color: Dataverse's, else the palette's for its place in the column. A value the column\n * doesn't list — an option added since its metadata was read — gets one of the palette's by its value,\n * rather than the gray of no value.\n */\nexport function optionColor(options: readonly ColorOption[], value: number | null): string {\n if (value === null) return NO_VALUE_COLOR;\n const index = options.findIndex((option) => option.value === value);\n if (index < 0) return OPTION_COLORS[Math.abs(value) % OPTION_COLORS.length]!;\n return options[index]!.color ?? OPTION_COLORS[index % OPTION_COLORS.length]!;\n}\n\n/** Where a value goes in a legend: the column's options in its order, then those it doesn't list, then no value. */\nexport function optionOrder(options: readonly ColorOption[], value: number | null): [number, number] {\n if (value === null) return [2, 0];\n const index = options.findIndex((option) => option.value === value);\n return index < 0 ? [1, value] : [0, index];\n}\n\n/** Dataverse's own latitude and longitude columns on accounts, contacts and other address tables. */\nexport const DEFAULT_LATITUDE_COLUMN = 'address1_latitude';\nexport const DEFAULT_LONGITUDE_COLUMN = 'address1_longitude';\n\n/** The most rows a map reads unless told otherwise. */\nexport const DEFAULT_MAX_ROWS = 1000;\n\n/** What the map draws for a Dataverse row: a marker, with the row and its view's columns. */\nexport interface MapRecord {\n record: TableRecord;\n /** The view's columns, for a popup showing the row. */\n columns: readonly ResolvedColumn[];\n /** For a row of a table registered for maps: where it is, and what its popup shows. */\n place?: MultiTablePlace;\n}\n\n/** A marker drawn for a row, carrying it as its data. */\nexport type MapRecordMarker = MapMarker<MapRecord>;\n\nexport interface RecordMarkerOptions {\n latitudeColumn: string;\n longitudeColumn: string;\n /** The column whose value names each marker. */\n titleColumn: string | undefined;\n /** Each row's marker color; the portal's accent color for undefined. */\n color: (record: TableRecord) => string | undefined;\n /** Each row's page, which its popup's heading links to. */\n url: (record: TableRecord) => string | undefined;\n}\n\nfunction toNumber(value: unknown): number | null {\n const number = typeof value === 'string' ? Number(value) : value;\n return typeof number === 'number' && Number.isFinite(number) ? number : null;\n}\n\n/** A marker for each row with both coordinates, at them; rows without are left off the map. */\nexport function recordMarkers(response: QueryResponse, options: RecordMarkerOptions): MapRecordMarker[] {\n const columns = response.columns ?? [];\n const markers: MapRecordMarker[] = [];\n\n for (const record of response.tableRecords ?? []) {\n const latitude = toNumber(readColumnRawValue(record, options.latitudeColumn));\n const longitude = toNumber(readColumnRawValue(record, options.longitudeColumn));\n if (latitude === null || longitude === null) continue;\n\n const title = options.titleColumn ? resolveColumnDisplayValue(record, options.titleColumn) : null;\n const color = options.color(record);\n const url = options.url(record);\n markers.push({\n kind: 'marker',\n id: getRecordReferenceId(record) ?? `${markers.length}`,\n position: { latitude, longitude },\n ...(title ? { title } : {}),\n ...(color ? { color } : {}),\n ...(url ? { url } : {}),\n data: { record, columns },\n });\n }\n\n return markers;\n}\n\n/**\n * A row's page: `url` with the row's id in place of `{0}` — and its table's in place of `{1}`, for a\n * map of several tables — or what `url` makes of the row.\n */\nexport function recordUrl(url: string | ((record: TableRecord) => string | undefined) | undefined, record: TableRecord): string | undefined {\n if (typeof url === 'function') return url(record);\n const id = getRecordReferenceId(record);\n return url && id ? url.replaceAll('{0}', id).replaceAll('{1}', record.tableName) : undefined;\n}\n\n/**\n * A FetchXML filter that leaves out rows with no coordinates, which would only take places in the\n * rows read.\n */\nexport function coordinatesFilterXml(latitudeColumn: string, longitudeColumn: string): string {\n const condition = (column: string) => `<condition attribute=\"${column.replace(/\"/g, '&quot;')}\" operator=\"not-null\" />`;\n return `<filter type=\"and\">${condition(latitudeColumn)}${condition(longitudeColumn)}</filter>`;\n}\n\n/** The table a FetchXML query reads, or null for one with no entity. */\nexport function fetchXmlTable(fetchXml: string): string | null {\n return /<entity\\s+[^>]*name\\s*=\\s*[\"']([^\"']+)[\"']/i.exec(fetchXml)?.[1] ?? null;\n}\n","import { Subtitle2 } from '@fluentui/react-components';\nimport {\n defaultViewId as userDefaultViewId,\n isViewHidden,\n MultiTableUses,\n MultiTableViewSchema,\n savedViewControl,\n SavedViewControlKind,\n shownViewTables,\n type MultiTablePlace,\n type MultiTablePlacesRequest,\n type MultiTablePlacesResponse,\n type MultiTableViewTable,\n} from '@powerportalspro/core';\nimport { usePowerPortalsPro, usePrefixedT } from '@powerportalspro/react';\nimport {\n EVERY_TABLE_VIEW_ID,\n MultiTableFilterDialog,\n SavedViewDialogs,\n useMultiTableTableSet,\n useMultiTableViews,\n useSavedViews,\n useSavedViewSession,\n ViewFilterMenu,\n ViewPicker,\n ViewRefreshButton,\n ViewToolbar,\n type GridManagedView,\n} from '@powerportalspro/react-fluent';\nimport { useEffect, useMemo, useRef, useState, type ReactNode } from 'react';\nimport type { DistanceUnit, MapProviderSettings, NearPlace } from './core/index.js';\nimport { NearSearch } from './near-search.js';\nimport { OPTION_COLORS } from './records.js';\n\n/** The colors a table's pins get when its registration gives none: the portal's accent first, then the palette. */\nexport const TABLE_COLORS: readonly string[] = ['var(--colorBrandBackground, #0f6cbd)', ...OPTION_COLORS];\n\n/** What a map of several tables reads, as the map's props give it. */\nexport interface MapTablesOptions {\n enabled: boolean;\n tables?: readonly string[] | undefined;\n defaultTables?: readonly string[] | undefined;\n defaultViewId?: string | undefined;\n viewIds?: readonly string[] | undefined;\n regarding?: { tableName: string; id: string } | undefined;\n allowFiltering: boolean;\n allowSavedViews: boolean;\n savedViewsKey?: string | undefined;\n signInUrl: string;\n title?: string | undefined;\n /** The Near button: the rows within a distance of a place, nearest first. */\n allowNearSearch?: boolean | undefined;\n nearDistances?: readonly number[] | undefined;\n nearDistance?: number | undefined;\n nearDistanceUnit?: DistanceUnit | undefined;\n /** Whose address search the Near button finds a place with: the map's provider. */\n provider?: MapProviderSettings | undefined;\n addressSearchCountries?: readonly string[] | undefined;\n /** The map's own buttons on the toolbar, before Filter and Refresh: its Print button. */\n toolbarActions?: ReactNode;\n}\n\n/** A table on the map's legend: its name and color, and what was cut short or couldn't be read. */\nexport interface MapTableLegendEntry {\n table: string;\n label: string;\n color: string;\n note: string | null;\n}\n\n/** What a map of several tables shows on the map itself. */\nexport interface MapTablesState {\n /** The rows with coordinates, of the tables shown. */\n places: readonly MultiTablePlace[];\n loading: boolean;\n failed: boolean;\n /** What the map is fitted to again when it changes: the view shown and the record, not a table switched on or off. */\n fitKey: string;\n /** Each table's pins' color, by logical name. */\n colors: Readonly<Record<string, string>>;\n legend: readonly MapTableLegendEntry[];\n /** The place the rows are near, and how near: drawn as a circle. Null when they aren't near one. */\n near: NearPlace | null;\n}\n\n/** What a map of several tables shows: on the map, and its toolbar and dialogs over it. */\nexport interface MapTables extends MapTablesState {\n toolbar: ReactNode;\n dialogs: ReactNode;\n}\n\n// A view the map offers: every table, one registered for maps (read by its id), or the user's (read\n// by its tables).\ninterface ListedView {\n id: string;\n name: string;\n multiTableViewId: string | null;\n tables: readonly MultiTableViewTable[] | null;\n}\n\nconst EMPTY: MultiTablePlacesResponse = { places: [] };\nconst NO_PLACES: readonly MultiTablePlace[] = [];\n\n/**\n * Several tables on one map: the tables registered for maps (`ForMaps`) — every one, a view registered\n * for maps, or a view of the user's own — read with their coordinates, each table in its own color,\n * under a toolbar as a timeline's: the view picker, then Filter (the view's filters, its tables and\n * the user's views) and Refresh. A user's views are views of several tables that name maps. The Blazor\n * twin is `Map.Tables.cs`.\n */\nexport function useMapTables(options: MapTablesOptions): MapTables {\n const { enabled, tables, defaultTables, defaultViewId, viewIds, regarding, allowFiltering, allowSavedViews, savedViewsKey, signInUrl, title, toolbarActions } = options;\n // The place the rows are near, chosen with the Near button.\n const [near, setNear] = useState<NearPlace | null>(null);\n // The page's views as text, for the list of views to follow them.\n const viewIdsKey = viewIds?.join(',') ?? null;\n const t = usePrefixedT('app.components.map');\n const { ppp, authState } = usePowerPortalsPro();\n\n const control = useMemo(\n () => savedViewControl(SavedViewControlKind.Map, allowSavedViews ? savedViewsKey : undefined),\n [allowSavedViews, savedViewsKey],\n );\n const saved = useSavedViews({ enabled: enabled && allowSavedViews, tableName: MultiTableViewSchema.table, control });\n const multiSaved = useMultiTableViews({ enabled: enabled && allowSavedViews && saved.available, control });\n // Until the user is known, and then their views read: the view the map opens on may be theirs.\n const awaitsSavedViews = allowSavedViews && (authState.status === 'loading' || saved.loading || multiSaved.loading);\n\n // The view the user chose; the tables they switched off and their filter are kept with it.\n const [chosen, setChosen] = useState<string | null>(null);\n // The view the map opened on, known once the views are read: the table set needs its id, since\n // only every table's view starts with the default tables alone.\n const [opened, setOpened] = useState<string>(EVERY_TABLE_VIEW_ID);\n const tableSetViewId = chosen ?? opened;\n const tableSet = useMultiTableTableSet({ use: MultiTableUses.Map, viewId: tableSetViewId, tables, defaultTables: defaultTables ?? [] });\n const registered = tableSet.registered;\n useEffect(() => {\n if (enabled && !registered) void tableSet.registeredAsync().catch(() => undefined);\n // Read once, and again after Refresh forgets it.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [enabled, registered]);\n\n const findSavedView = (id: string) => multiSaved.views.find((x) => x.id.toLowerCase() === id.toLowerCase());\n const offered = allowSavedViews && saved.available;\n\n // The views on offer — every table and the ones registered for maps, or the page's viewIds, then the\n // user's, their default first and without the ones they hid but the one shown — and every one, for\n // Manage views. As Blazor's Map.ChooseView.\n const { views, allViews } = useMemo(() => {\n if (!registered) return { views: [] as ListedView[], allViews: [] as ListedView[] };\n const everyTable: ListedView = { id: EVERY_TABLE_VIEW_ID, name: t('every-table'), multiTableViewId: null, tables: null };\n const registeredView = (view: (typeof registered.views)[number]): ListedView => ({\n id: view.id,\n name: view.name,\n multiTableViewId: view.id,\n tables: null,\n });\n const named =\n viewIdsKey === null\n ? null\n : viewIdsKey\n .split(',')\n .map((id) => registered.views.find((view) => view.id.toLowerCase() === id.toLowerCase()))\n .filter((view): view is (typeof registered.views)[number] => view !== undefined)\n .map(registeredView);\n // The page naming none registered for maps: every table, rather than nothing to show.\n const listed: ListedView[] =\n named === null ? [everyTable, ...registered.views.map(registeredView)] : named.length > 0 ? named : [everyTable];\n if (offered) for (const own of multiSaved.views) listed.push({ id: own.id, name: own.name, multiTableViewId: null, tables: [...own.tables] });\n const first = offered ? userDefaultViewId(saved.settings, listed.map((x) => x.id), control) : undefined;\n const ordered = first ? [...listed.filter((x) => x.id === first), ...listed.filter((x) => x.id !== first)] : listed;\n const shownOnes = ordered.filter((x) => x.id === chosen || !offered || !isViewHidden(saved.settings, x.id, control));\n return { views: shownOnes.length > 0 ? shownOnes : ordered, allViews: listed };\n // `t` is the same strings throughout.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [registered, offered, multiSaved.views, saved.settings, control, chosen, viewIdsKey]);\n\n const userDefault = offered ? userDefaultViewId(saved.settings, views.map((x) => x.id), control) : undefined;\n const shownView =\n views.find((x) => x.id === chosen) ??\n views.find((x) => x.id === userDefault) ??\n views.find((x) => x.id === defaultViewId) ??\n views[0] ??\n null;\n\n useEffect(() => {\n if (!chosen && shownView && shownView.id !== opened) setOpened(shownView.id);\n });\n\n // The tables the view shows the user, narrowed to the map's: none until the table set is on it.\n const known =\n registered && shownView && shownView.id === tableSetViewId ? tableSet.tablesOf(shownView.tables, shownView.multiTableViewId) : null;\n useEffect(() => {\n if (known && known.join(',') !== tableSet.known.join(',')) tableSet.setKnown(tableSetViewId, known);\n });\n\n const filter = tableSet.filter;\n const shownTables = tableSet.shown;\n const [refreshes, setRefreshes] = useState(0);\n const [read, setRead] = useState<{ key: string; response: MultiTablePlacesResponse } | null>(null);\n const [failed, setFailed] = useState(false);\n const request: MultiTablePlacesRequest | null =\n enabled && shownView && known && known.join(',') === tableSet.known.join(',') && !awaitsSavedViews\n ? {\n viewId: filter ? null : shownView.multiTableViewId,\n tables: filter ? [...filter.tables] : shownView.tables ? [...shownView.tables] : null,\n includeTables: [...shownTables],\n regarding: regarding ? { tableName: regarding.tableName, id: regarding.id } : null,\n near: near ? { latitude: near.latitude, longitude: near.longitude, distance: near.distance, unit: near.unit } : null,\n }\n : null;\n const requestKey = request ? JSON.stringify([request, refreshes]) : null;\n const latestRequest = useRef(request);\n latestRequest.current = request;\n\n useEffect(() => {\n const asked = latestRequest.current;\n if (!asked || !requestKey) return;\n setFailed(false);\n if ((asked.includeTables ?? []).length === 0) {\n setRead({ key: requestKey, response: EMPTY });\n return;\n }\n const controller = new AbortController();\n ppp.loadMultiTablePlacesAsync(asked, controller.signal).then(\n (response) => {\n if (!controller.signal.aborted) setRead({ key: requestKey, response });\n },\n (error: unknown) => {\n if (controller.signal.aborted) return;\n console.warn(\"[Map] The map's tables could not be read.\", error);\n setFailed(true);\n setRead({ key: requestKey, response: EMPTY });\n },\n );\n return () => controller.abort();\n }, [ppp, requestKey]);\n\n const response = read?.key === requestKey ? read.response : null;\n const loading = enabled && !response && !failed;\n\n const tableLabel = (table: string) => tableSet.tableLabel(table);\n const tableColor = (table: string) => {\n const color = tableSet.infoOf(table)?.definition?.color;\n if (color) return color;\n const index = Math.max(0, tableSet.known.findIndex((x) => x.toLowerCase() === table.toLowerCase()));\n return TABLE_COLORS[index % TABLE_COLORS.length]!;\n };\n\n const failedTables = new Set((response?.failures ?? []).map((x) => x.table.toLowerCase()));\n const truncated = new Set((response?.truncated ?? []).map((x) => x.toLowerCase()));\n const legend: MapTableLegendEntry[] =\n !enabled || (shownTables.length < 2 && failedTables.size === 0 && truncated.size === 0)\n ? []\n : shownTables.map((table) => ({\n table,\n label: tableLabel(table),\n color: tableColor(table),\n note: failedTables.has(table.toLowerCase()) ? t('table-failed') : truncated.has(table.toLowerCase()) ? t('table-truncated') : null,\n }));\n\n // ---- The toolbar ----\n\n // The view's tables by their queries: its own, a registered view's, or every table it shows.\n const viewTables = (): MultiTableViewTable[] => {\n if (!shownView) return [];\n if (shownView.tables) return [...shownView.tables];\n if (shownView.multiTableViewId) return [...(registered?.views.find((x) => x.id === shownView.multiTableViewId)?.tables ?? [])];\n return tableSet.known.map((table): MultiTableViewTable => ({ table }));\n };\n const showsFilterButton = allowFiltering && viewTables().length > 0;\n const openFilter = async () => {\n const view = shownView;\n const tablesOfIt = viewTables();\n if (!view || tablesOfIt.length === 0) return;\n try {\n tableSet.openFilter(view.id, await tableSet.filterQueries(tablesOfIt), tableSet.known, tableLabel);\n } catch (error) {\n console.warn('[Map] The filters of the view shown could not be read.', error);\n }\n };\n\n // The tables the map shows now, as a view keeps them: the view's own, with the user's filter in\n // them, the ones switched off left out.\n const currentTables = () =>\n shownView\n ? shownViewTables(filter ? filter.tables : viewTables(), tableSet.known, tableSet.shown, (table) => !!tableSet.infoOf(table)?.isActivity)\n : [];\n const viewChanged = !!filter || tableSet.tablesChanged;\n const shownSaved = shownView ? findSavedView(shownView.id) : undefined;\n const choose = (id: string | null) => {\n setChosen(id);\n tableSet.reset();\n };\n\n const viewName = (id: string) => allViews.find((x) => x.id.toLowerCase() === id.toLowerCase())?.name ?? findSavedView(id)?.name ?? t('every-table');\n const session = useSavedViewSession({\n saved,\n signInUrl,\n operations: {\n shownViewId: shownView?.id,\n savedViewName: (id) => findSavedView(id)?.name,\n managedViewName: viewName,\n managedViews: (): GridManagedView[] =>\n allViews.map((view) => ({\n id: view.id,\n name: view.name,\n isSaved: !!findSavedView(view.id),\n isDefault: userDefaultViewId(saved.settings, allViews.map((x) => x.id), control) === view.id,\n isHidden: isViewHidden(saved.settings, view.id, control),\n isShown: view.id === shownView?.id,\n })),\n save: async () => {\n const tablesNow = currentTables();\n if (!shownSaved || tablesNow.length === 0) return;\n await multiSaved.update(shownSaved.id, { tables: tablesNow });\n // The tables shown, and the filter, are the view's own now.\n choose(shownSaved.id);\n },\n saveAs: async (name) => {\n const tablesNow = currentTables();\n if (tablesNow.length === 0) return;\n const view = await multiSaved.create(name, tablesNow, {});\n choose(view.id);\n },\n clone: async (id, name) => {\n const view = allViews.find((x) => x.id === id);\n const tablesOfIt =\n findSavedView(id)?.tables ??\n (view?.multiTableViewId ? registered?.views.find((x) => x.id === view.multiTableViewId)?.tables : null) ??\n (view\n ? (registered?.tables ?? [])\n .filter((x) => !tableSet.allowed || tableSet.allowed.has(x.table.toLowerCase()))\n .map((x): MultiTableViewTable => ({ table: x.table }))\n : []);\n if (tablesOfIt.length === 0) return;\n await multiSaved.create(name, tablesOfIt, {});\n },\n rename: async (id, name) => void (await multiSaved.update(id, { name })),\n remove: async (id) => {\n await multiSaved.remove(id);\n await saved.reloadSettings();\n if (shownView?.id === id) choose(null);\n },\n openView: (id) => {\n if (id !== shownView?.id) choose(id);\n },\n },\n });\n\n const toolbar = enabled ? (\n <ViewToolbar\n className=\"ppp-map-header\"\n ariaLabel={t('toolbar')}\n start={\n // A choice of one where the user saves views: the picker is how they reach theirs.\n views.length > (session.showsMenu ? 0 : 1) ? (\n <ViewPicker\n className=\"ppp-map-view-picker\"\n options={views.map((view) => ({ id: view.id, label: view.name }))}\n value={shownView?.id}\n onChange={choose}\n isUserView={(id) => !!findSavedView(id)}\n />\n ) : title ? (\n <Subtitle2 as=\"h2\">{title}</Subtitle2>\n ) : null\n }\n >\n {/* The rows near a place: a search of its own, before Filter, as a grid's search box is. */}\n {options.allowNearSearch && (\n <NearSearch\n value={near}\n onChange={setNear}\n distances={options.nearDistances}\n defaultDistance={options.nearDistance}\n defaultUnit={options.nearDistanceUnit}\n provider={options.provider}\n countries={options.addressSearchCountries}\n />\n )}\n {toolbarActions}\n {/* The view's filters, the tables it shows, and the user's own views — saving the tables shown\n with their filters. A visitor who isn't signed in is asked to sign in for any of their views. */}\n <ViewFilterMenu\n changed={viewChanged}\n onEditFilters={showsFilterButton ? () => void openFilter() : undefined}\n tables={tableSet.menuTables(tableLabel)}\n onTableShownChange={tableSet.showTable}\n savedViews={session.menu({\n canSave: !!shownSaved && viewChanged,\n canSaveAs: currentTables().length > 0 && viewChanged,\n canSetDefault: !!shownView && userDefault !== shownView.id,\n })}\n />\n <ViewRefreshButton\n onClick={() => {\n tableSet.forget();\n setRefreshes((x) => x + 1);\n }}\n />\n </ViewToolbar>\n ) : null;\n\n const dialogs = enabled ? (\n <>\n <MultiTableFilterDialog\n open={tableSet.filterDialog !== null}\n tabs={tableSet.filterDialog?.tabs ?? []}\n viewTabs={tableSet.filterDialog?.viewTabs}\n onApply={(criteria, restoreView) => void tableSet.applyFilter(criteria, restoreView)}\n onCancel={tableSet.closeFilter}\n />\n <SavedViewDialogs session={session} />\n </>\n ) : null;\n\n return {\n places: response?.places ?? NO_PLACES,\n loading,\n failed,\n // A new place to be near, or distance, is a new extent too.\n fitKey: `${shownView?.id ?? ''}|${regarding?.id ?? ''}|${JSON.stringify(filter?.tables ?? null)}|${\n near ? JSON.stringify([near.latitude, near.longitude, near.distance, near.unit]) : ''\n }`,\n colors: Object.fromEntries(tableSet.known.map((table) => [table, tableColor(table)])),\n legend,\n near: enabled ? near : null,\n toolbar,\n dialogs,\n };\n}\n\n/**\n * The toolbar and dialogs of a map of several tables, mounted only for one — its saved views need the\n * portal's dialogs, which a map of its own items doesn't — telling the map what to show as it changes.\n */\nexport function MapTablesBar({ onState, ...options }: Omit<MapTablesOptions, 'enabled'> & { onState: (state: MapTablesState) => void }) {\n const tables = useMapTables({ ...options, enabled: true });\n const { places, loading, failed, fitKey, colors, legend, near } = tables;\n const key = JSON.stringify([loading, failed, fitKey, colors, legend, near]);\n const latest = useRef(onState);\n latest.current = onState;\n useEffect(() => {\n latest.current({ places, loading, failed, fitKey, colors, legend, near });\n // The rest is in its key.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [places, key]);\n return (\n <>\n {tables.toolbar}\n {tables.dialogs}\n </>\n );\n}\n","import {\n forwardRef,\n useEffect,\n useImperativeHandle,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n type CSSProperties,\n type ForwardedRef,\n type KeyboardEvent,\n type MouseEvent,\n type ReactElement,\n type ReactNode,\n type RefAttributes,\n} from 'react';\nimport {\n Button,\n Card,\n Link,\n MessageBar,\n MessageBarBody,\n Spinner,\n Text,\n makeStyles,\n mergeClasses,\n shorthands,\n tokens,\n} from '@fluentui/react-components';\nimport { Dismiss16Regular } from '@fluentui/react-icons';\nimport { MapPrintButton, SharedTooltip, type GridMapPrint } from '@powerportalspro/react-fluent';\nimport {\n findRecordPage,\n recordPageUrl,\n resolveColumnDisplayValue,\n type PowerPortalsProClient,\n type QueryFilter,\n type QueryRequest,\n type QueryResponse,\n type TableRecord,\n} from '@powerportalspro/core';\nimport { useLocale, usePowerPortalsPro, usePrefixedT, useRecordPages, useTableMetadata, useViewMetadata } from '@powerportalspro/react';\nimport {\n DistanceUnits,\n formatDistance,\n MapController,\n type DistanceUnit,\n type MapCamera,\n type MapClickEvent,\n type MapAddressStatus,\n type MapErrorKind,\n type MapItem,\n type MapLegendEntry,\n type MapPlace,\n type MapPosition,\n type MapPrintEntry,\n type MapPrintPopup,\n type MapProviderSettings,\n type MapStyle,\n type MapView,\n} from './core/index.js';\nimport { MapTablesBar, type MapTablesState } from './map-tables.js';\nimport { NEAR_CIRCLE_ID, nearPlaceItems } from './near-search.js';\nimport { portalSettingsCache } from './portal-settings-cache.js';\nimport {\n DEFAULT_LATITUDE_COLUMN,\n DEFAULT_LONGITUDE_COLUMN,\n DEFAULT_MAX_ROWS,\n colorOptions,\n coordinatesFilterXml,\n fetchXmlTable,\n optionColor,\n optionOrder,\n optionValue,\n recordMarkers,\n recordUrl as urlOfRecord,\n type MapRecord,\n} from './records.js';\n\nconst STRINGS_PREFIX = 'app.components.map';\n\n/** An item clicked on the map, with where it was clicked. */\nexport interface MapItemClick<TData> {\n item: MapItem<TData>;\n position: MapPosition;\n /** Keeps the map from opening the item's popup: for a page that does something else with the click. */\n preventDefault(): void;\n /** Whether `preventDefault` was called. */\n readonly defaultPrevented: boolean;\n}\n\nfunction itemClick<TData>(item: MapItem<TData>, position: MapPosition): MapItemClick<TData> {\n let prevented = false;\n return {\n item,\n position,\n preventDefault: () => {\n prevented = true;\n },\n get defaultPrevented() {\n return prevented;\n },\n };\n}\n\n/** A map as a Print button of the page's own works it (`onPrintChange`): a grid's map's, the same. */\nexport type MapPrint = GridMapPrint;\n\n/** What a map can be told to do through its ref. */\nexport interface MapHandle {\n /** Moves the view, animated unless `animate` is false. */\n setCamera(camera: MapCamera, animate?: boolean): void;\n /** Moves the view to show every item — or, given `ids`, the items of those ids. */\n fitToItems(ids?: readonly string[]): void;\n /** Opens the popup of the item of that id. */\n openPopup(id: string): void;\n closePopup(): void;\n /**\n * Finds `text` with the provider's address search and goes there: the first place found, pinned.\n * Null when nothing is found, or the provider has no search.\n */\n goToAddress(text: string): Promise<MapPlace | null>;\n /** Empties the address search and takes the place it found off the map. */\n clearAddress(): void;\n /** What the map shows now; null before it has drawn. */\n getView(): MapView | null;\n /**\n * Prints the map, with `printTitle` above it, its legend, and `printEntries` listed under it — as\n * the print button does.\n */\n print(): Promise<void>;\n /**\n * Saves the map as a PNG image of that name, with its legend. False when the provider's map can't\n * be copied (Google's), or before the map has drawn.\n */\n saveImage(fileName?: string): Promise<boolean>;\n /** The provider's own map object — a MapLibre `Map`, a `google.maps.Map` — or null before it has drawn. */\n readonly native: unknown;\n}\n\nexport interface MapProps<TData = unknown> {\n /**\n * Which provider draws the map, and how it looks — the portal's own provider, from its\n * `PowerPortalsPro:Maps:Provider` setting, when unset. Keys are only ever the portal's: it fills in\n * each provider's from its `PowerPortalsPro:Maps` settings, with any the page leaves unset.\n */\n provider?: MapProviderSettings;\n /** Markers, lines, areas and circles of the page's own, drawn with any rows read. */\n items?: readonly MapItem<TData>[];\n /** A view whose rows to plot, each at its latitude and longitude. */\n viewId?: string;\n /** A FetchXML query whose rows to plot, instead of a view. */\n fetchXml?: string;\n /** Narrows the rows read — to those related to the page's record, say. */\n filters?: readonly QueryFilter[];\n /** The rows' latitude column. Default `address1_latitude`. */\n latitudeColumn?: string;\n /** The rows' longitude column. Default `address1_longitude`. */\n longitudeColumn?: string;\n /** The column that names each row's marker. The table's primary name column by default. */\n titleColumn?: string;\n /**\n * The rows' markers' color, as any CSS color: one for every row, or each row's own. The portal's\n * accent color by default.\n */\n recordColor?: string | ((record: TableRecord) => string | undefined);\n /**\n * A choice, status, status reason or yes/no column whose options color the rows' markers — each\n * the color Dataverse gives it, or one of Fluent's palette — with a legend of the options shown.\n */\n colorColumn?: string;\n /** Shows the legend of `colorColumn`'s options. Default `true`. */\n showLegend?: boolean;\n /**\n * Each row's page, which its popup's heading links to, in place of its record's page registered\n * with `AddRecordPage`: a URL with `{0}` in place of the row's id and `{1}` its table's, or the URL\n * a function makes of the row.\n */\n recordUrl?: string | ((record: TableRecord) => string | undefined);\n /**\n * Whether a row's popup heading links to its record's page, registered with `AddRecordPage`, when\n * no `recordUrl` is given. Default `true`; a table with no page shows no link.\n */\n showRecordLinks?: boolean;\n /** Follows a popup's link in place of the browser — `(url) => navigate(url)` for react-router. */\n onNavigate?: (url: string) => void;\n /** A box over the map's corner for finding an address with the provider's own search. Default `false`. */\n showAddressSearch?: boolean;\n /** ISO 3166-1 two-letter codes of the countries the address search finds places in. Anywhere when unset. */\n addressSearchCountries?: readonly string[];\n /**\n * An address to show, such as `\"1 Microsoft Way, Redmond, WA 98052\"`: found with the provider's\n * own search once the map is drawn, and again whenever it changes, then pinned and brought into\n * view. A spinner shows while it is looked for, and a message when it isn't found.\n */\n address?: string;\n /**\n * Keeps the view on chosen items: fitted to the items of these ids — or to every item when it is\n * empty — each time it changes, and when items it was fitted to are gone (a new page of them).\n * Items only added, or restyled, leave the view where the user moved it. Unset, the view is fitted\n * to the items only as they first arrive.\n */\n fitItemIds?: readonly string[];\n /**\n * Puts the rows of the tables registered for maps (`ForMaps`) on the map, beside its own rows and\n * items: every one, or a view of some, each table's pins in its registration's color, with a toolbar\n * above the map to choose the view and the tables shown. Default `false`.\n */\n multiTable?: boolean;\n /** Only these of the tables registered for maps, by logical name. Every one the user may read when unset. */\n tables?: readonly string[];\n /** The tables shown at first in the view of every table; the others start switched off. Every one when unset. */\n defaultTables?: readonly string[];\n /** The view shown at first: one registered for maps, or one of the user's. */\n defaultViewId?: string;\n /**\n * Only these views, in this order: views registered for maps (`AddMultiTableView` with `ForMaps`),\n * by id. The view of every table is offered only when this is unset; a signed-in user's own views\n * follow either way. Unset, the view of every table, then every view registered for maps.\n */\n viewIds?: readonly string[];\n /** Only the rows about this record, through each table's regarding column. */\n regarding?: { tableName: string; id: string };\n /** Offers the view's filters to change in the Filter menu, a tab for each table shown. Default `false`. */\n allowFiltering?: boolean;\n /**\n * Lets signed-in users save the tables shown, with their filters, as views of their own, and choose\n * their default view and hide the views they don't use. Default `false`.\n */\n allowSavedViews?: boolean;\n /** Names this map among the maps, so the views saved on it are its own. Shared with every map without one when unset. */\n savedViewsKey?: string;\n /** Where a visitor who isn't signed in is sent to sign in, from the saved views' menu. Default `Account/Login`. */\n signInUrl?: string;\n /** The toolbar's heading when there is only one view to show. None when unset. */\n title?: string;\n /**\n * A Near button on the toolbar of a map of several tables: only the rows within a distance of a\n * place — an address found with the provider's search, or the visitor's location — nearest first,\n * the circle drawn and the map fitted to it, each popup saying how far its row is. Default `false`.\n */\n allowNearSearch?: boolean;\n /** The distances the Near button offers. Default 1, 5, 10, 25, 50 and 100. */\n nearDistances?: readonly number[];\n /** The distance the Near button starts at. Default 25. */\n nearDistance?: number;\n /** The unit the Near button starts in: `DistanceUnits.Miles` (default) or `DistanceUnits.Kilometers`. */\n nearDistanceUnit?: DistanceUnit;\n /** The most rows read. Default 1000, at most 5000; a note on the map says when there are more. */\n maxRows?: number;\n /** Streets, aerial imagery, or both. Default `road`. */\n mapStyle?: MapStyle;\n /** Where the map looks first. Fitted to its items when unset. */\n center?: MapPosition;\n /** The zoom it starts at, with `center`: 0 is the whole world, about 15 a street. Default 12. */\n zoom?: number;\n /** Gather markers close together into clusters, which zoom in when clicked. Default `true`. */\n cluster?: boolean;\n /**\n * A Print button — on the toolbar with `multiTable`, else over the map's top right corner — for\n * printing the map and, where the provider's map can be copied, saving it as an image. A map is\n * printed as an image with its pins, legend and the provider's attribution, or, for Google, as it\n * is on the page. Default `false`.\n */\n showPrintButton?: boolean;\n /** The heading printed above the map. `title` when unset. */\n printTitle?: string;\n /**\n * Records listed under the map when it is printed, each beside its pin's label — or a function\n * that makes them as it is printed, for a long list, which then costs nothing until someone prints.\n */\n printEntries?: readonly MapPrintEntry[] | (() => readonly MapPrintEntry[]);\n /**\n * Called as the map can be printed, or no longer — before it has drawn, once it has failed, as it\n * goes — for a Print button of the page's own, in a toolbar around the map, say.\n */\n onPrintChange?: (print: MapPrint | null) => void;\n /** Draw the dark map, where the provider has one, when the portal's theme is dark. Default `true`. */\n usePortalTheme?: boolean;\n /**\n * Open a popup on the item clicked: `renderPopup`'s content, a row's view columns, or an item's\n * title. Default `true`. `onItemClick` is called either way.\n */\n showPopups?: boolean;\n /** The popup's content for an item, in place of the default. Return null for no popup. */\n renderPopup?: (item: MapItem<TData | MapRecord>) => ReactNode;\n /** Options for the provider's own map, over the map's: the way to its other features. */\n nativeOptions?: Record<string, unknown>;\n /** CSS height of the map. Default `400px`. */\n height?: string | number;\n /** CSS width of the map. Default `100%`. */\n width?: string | number;\n className?: string;\n style?: CSSProperties;\n /** A click on the map, away from its items. */\n onMapClick?: (event: MapClickEvent) => void;\n /**\n * A click on an item — a row's marker, a line, an area or a circle. The map opens the item's popup\n * after it, unless `event.preventDefault()` was called.\n */\n onItemClick?: (event: MapItemClick<TData | MapRecord>) => void;\n /** The address search went to a place, or, with null, was cleared. */\n onAddressSelected?: (place: MapPlace | null) => void;\n /** The view has settled after a move. */\n onViewChanged?: (view: MapView) => void;\n /** The map couldn't be drawn, or its rows read. */\n onError?: (message: string) => void;\n}\n\ntype PopupState<TData> =\n | { kind: 'item'; item: MapItem<TData | MapRecord>; position: MapPosition }\n | { kind: 'list'; items: MapItem<TData | MapRecord>[]; position: MapPosition };\n\nconst useStyles = makeStyles({\n root: {\n position: 'relative',\n // Lets the map shrink inside a flex or grid parent, as the Chart's wrapper does.\n minWidth: 0,\n overflow: 'hidden',\n borderRadius: tokens.borderRadiusMedium,\n backgroundColor: tokens.colorNeutralBackground3,\n },\n overlay: {\n position: 'absolute',\n inset: 0,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n zIndex: 3,\n pointerEvents: 'none',\n },\n message: {\n position: 'absolute',\n top: tokens.spacingVerticalS,\n left: tokens.spacingHorizontalS,\n right: tokens.spacingHorizontalS,\n zIndex: 3,\n },\n printButton: {\n boxShadow: tokens.shadow4,\n },\n // The legend and the note over the bottom left corner, clear of a provider's logo there.\n corner: {\n position: 'absolute',\n left: tokens.spacingHorizontalS,\n bottom: `calc(${tokens.spacingVerticalXXL} + ${tokens.spacingVerticalS})`,\n zIndex: 1,\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'flex-start',\n gap: tokens.spacingVerticalXS,\n maxWidth: `calc(100% - 2 * ${tokens.spacingHorizontalS})`,\n pointerEvents: 'none',\n },\n note: {\n padding: `${tokens.spacingVerticalXXS} ${tokens.spacingHorizontalS}`,\n borderRadius: tokens.borderRadiusMedium,\n backgroundColor: tokens.colorNeutralBackground1,\n boxShadow: tokens.shadow4,\n },\n legend: {\n display: 'flex',\n flexWrap: 'wrap',\n columnGap: tokens.spacingHorizontalM,\n rowGap: tokens.spacingVerticalXXS,\n margin: 0,\n padding: `${tokens.spacingVerticalXS} ${tokens.spacingHorizontalS}`,\n listStyleType: 'none',\n borderRadius: tokens.borderRadiusMedium,\n backgroundColor: tokens.colorNeutralBackground1,\n boxShadow: tokens.shadow4,\n },\n legendItem: {\n display: 'inline-flex',\n alignItems: 'center',\n gap: tokens.spacingHorizontalXS,\n },\n legendNote: {\n color: tokens.colorNeutralForeground3,\n },\n frame: {\n display: 'flex',\n flexDirection: 'column',\n gap: tokens.spacingVerticalS,\n minWidth: 0,\n },\n legendDot: {\n flexShrink: 0,\n width: '10px',\n height: '10px',\n borderRadius: tokens.borderRadiusCircular,\n },\n // A card that stands off the map in either theme: room inside, rounder corners, and a hairline\n // border as well as the shadow, which a dark map swallows.\n popup: {\n ...shorthands.padding(tokens.spacingVerticalM, tokens.spacingHorizontalL),\n ...shorthands.border(tokens.strokeWidthThin, 'solid', tokens.colorNeutralStroke2),\n // Fluent's 2XLarge radius, which this version of its React theme doesn't define yet.\n borderRadius: 'var(--borderRadius2XLarge, 12px)',\n width: 'max-content',\n maxWidth: '340px',\n minWidth: '200px',\n maxHeight: '360px',\n overflowY: 'auto',\n boxShadow: tokens.shadow28,\n },\n popupHeader: {\n display: 'flex',\n alignItems: 'flex-start',\n gap: tokens.spacingHorizontalS,\n },\n popupTitle: {\n flexGrow: 1,\n minWidth: 0,\n overflowWrap: 'anywhere',\n },\n popupBody: {\n flexGrow: 1,\n minWidth: 0,\n overflowWrap: 'anywhere',\n },\n fields: {\n display: 'grid',\n gridTemplateColumns: 'auto 1fr',\n columnGap: tokens.spacingHorizontalM,\n rowGap: tokens.spacingVerticalXXS,\n margin: 0,\n },\n fieldName: {\n color: tokens.colorNeutralForeground3,\n },\n fieldValue: {\n margin: 0,\n overflowWrap: 'anywhere',\n },\n list: {\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'stretch',\n gap: tokens.spacingVerticalXXS,\n margin: 0,\n padding: 0,\n listStyleType: 'none',\n },\n listButton: {\n justifyContent: 'flex-start',\n width: '100%',\n },\n});\n\n// A map of its own rows and items reads no tables; one of several tables shows none until they come.\nconst NO_TABLES: MapTablesState = { places: [], loading: false, failed: false, fitKey: '', colors: {}, legend: [], near: null };\nconst TABLES_LOADING: MapTablesState = { ...NO_TABLES, loading: true };\n\nconst cssLength = (value: string | number) => (typeof value === 'number' ? `${value}px` : value);\n\n\nfunction itemKind(item: MapItem<unknown>): 'marker' | 'shape' {\n return item.kind === 'marker' ? 'marker' : 'shape';\n}\n\nfunction isRecord(data: unknown): data is MapRecord {\n return !!data && typeof data === 'object' && 'record' in data && 'columns' in data;\n}\n\nfunction MapImpl<TData = unknown>(\n {\n provider,\n items,\n viewId,\n fetchXml,\n filters,\n latitudeColumn = DEFAULT_LATITUDE_COLUMN,\n longitudeColumn = DEFAULT_LONGITUDE_COLUMN,\n titleColumn,\n recordColor,\n colorColumn,\n showLegend = true,\n recordUrl,\n showRecordLinks = true,\n onNavigate,\n showAddressSearch = false,\n addressSearchCountries,\n address,\n fitItemIds,\n multiTable = false,\n tables,\n defaultTables,\n defaultViewId,\n viewIds,\n regarding,\n allowFiltering = false,\n allowSavedViews = false,\n savedViewsKey,\n signInUrl = 'Account/Login',\n title,\n allowNearSearch = false,\n nearDistances,\n nearDistance,\n nearDistanceUnit,\n maxRows = DEFAULT_MAX_ROWS,\n mapStyle = 'road',\n center,\n zoom,\n cluster = true,\n showPrintButton = false,\n printTitle,\n printEntries,\n onPrintChange,\n usePortalTheme = true,\n showPopups = true,\n renderPopup,\n nativeOptions,\n height = '400px',\n width = '100%',\n className,\n style,\n onMapClick,\n onItemClick,\n onAddressSelected,\n onViewChanged,\n onError,\n }: MapProps<TData>,\n ref: ForwardedRef<MapHandle>,\n) {\n const styles = useStyles();\n const t = usePrefixedT(STRINGS_PREFIX);\n const { locale } = useLocale();\n const { ppp } = usePowerPortalsPro();\n\n // The map's own element, which React never renders into: the provider's map goes there.\n const hostRef = useRef<HTMLDivElement>(null);\n const popupRef = useRef<HTMLDivElement>(null);\n // One tooltip for every pin and cluster, the address box's button and the popup's: they name their\n // text in `data-ppp-tooltip`.\n const rootRef = useRef<HTMLDivElement>(null);\n const controllerRef = useRef<MapController | null>(null);\n const [ready, setReady] = useState(false);\n const [failure, setFailure] = useState<{ kind: MapErrorKind; message: string } | null>(null);\n const [addressStatus, setAddressStatus] = useState<MapAddressStatus | null>(null);\n const [popup, setPopup] = useState<PopupState<TData> | null>(null);\n // Whether the provider's map can be saved as an image, as the map last drawn says; and whether a\n // printout or image is being made.\n const [canSaveImage, setCanSaveImage] = useState(false);\n const [printing, setPrinting] = useState(false);\n\n // The tables' record pages, which rows' popups link to where the page gives no address of its\n // own; read only for a map of rows. Blazor's twin is Map.RecordPages.cs.\n const usesRecordPages = showRecordLinks && !recordUrl;\n const recordPages = useRecordPages({ enabled: usesRecordPages && (multiTable || !!viewId || !!fetchXml) });\n const recordPageOf = (row: MapRecord): string | undefined => {\n const id = row.place?.id ?? row.record.id;\n const page = usesRecordPages && id ? findRecordPage(recordPages, row.place?.table ?? row.record.tableName) : undefined;\n return page && id ? recordPageUrl(page, id) : undefined;\n };\n\n // The latest props, for the controller's events, which are bound once.\n const latest = useRef({ onMapClick, onItemClick, onAddressSelected, onViewChanged, onError, onNavigate, showPopups, t });\n latest.current = { onMapClick, onItemClick, onAddressSelected, onViewChanged, onError, onNavigate, showPopups, t };\n\n // ---- Rows ----\n\n const viewMetadata = useViewMetadata(viewId ?? '', { enabled: !!viewId });\n const table = viewId ? viewMetadata.data?.tableName : fetchXml ? fetchXmlTable(fetchXml) ?? undefined : undefined;\n const tableMetadata = useTableMetadata(table ?? '', { enabled: !!table && (!titleColumn || !!colorColumn) });\n const recordTitleColumn = titleColumn ?? tableMetadata.data?.primaryNameColumn;\n // The options of the column coloring the markers, once its metadata has come.\n const colorChoices = useMemo(() => {\n if (!colorColumn) return null;\n const column = tableMetadata.data?.columns.find((c) => c.columnName.toLowerCase() === colorColumn.toLowerCase());\n return colorOptions(column);\n }, [colorColumn, tableMetadata.data]);\n // The rows are read once the column naming them is known, or known not to be found, rather than\n // read again when it arrives.\n const titleSettled =\n !!titleColumn ||\n (!!viewId && !!viewMetadata.error) ||\n (table ? tableMetadata.data !== undefined || tableMetadata.error !== undefined : !viewId);\n\n const request = useMemo<QueryRequest | null>(() => {\n if ((!viewId && !fetchXml) || !titleSettled) return null;\n return {\n ...(viewId ? { viewId } : { fetchXml }),\n pageSize: Math.max(1, Math.min(maxRows, 5000)),\n filters: [\n ...(filters ?? []),\n { $type: 'FetchXmlFilter', filterXml: coordinatesFilterXml(latitudeColumn, longitudeColumn) } as QueryFilter,\n ],\n additionalColumns: [\n latitudeColumn,\n longitudeColumn,\n ...(recordTitleColumn ? [recordTitleColumn] : []),\n ...(colorColumn ? [colorColumn] : []),\n ],\n } as QueryRequest;\n }, [viewId, fetchXml, filters, maxRows, latitudeColumn, longitudeColumn, recordTitleColumn, colorColumn, titleSettled]);\n const requestKey = request ? JSON.stringify(request) : null;\n\n const [rows, setRows] = useState<{ key: string; response: QueryResponse } | null>(null);\n const [rowsFailed, setRowsFailed] = useState(false);\n useEffect(() => {\n if (!request || !requestKey) {\n setRows(null);\n setRowsFailed(false);\n return;\n }\n const controller = new AbortController();\n setRowsFailed(false);\n ppp.loadQueryAsync(request, controller.signal).then(\n (response) => {\n if (!controller.signal.aborted) setRows({ key: requestKey, response });\n },\n (error: unknown) => {\n if (controller.signal.aborted) return;\n setRowsFailed(true);\n latest.current.onError?.(error instanceof Error ? error.message : String(error));\n },\n );\n return () => controller.abort();\n // The request is in its key.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [ppp, requestKey]);\n\n // The rows of the request as it is now: another view's stay off the map while this one's load.\n const currentRows = rows?.key === requestKey ? rows : null;\n // A row's color: its option's in the column coloring them, else the page's for it.\n const colorOf = (record: TableRecord): string | undefined =>\n colorColumn && colorChoices\n ? optionColor(colorChoices, optionValue(record, colorColumn))\n : typeof recordColor === 'function'\n ? recordColor(record)\n : recordColor;\n // The colors and links the rows get, as text: a function written in the page's render is a new one\n // each time, and only a different answer for some row makes the markers again.\n const rowRecords = currentRows?.response.tableRecords ?? [];\n const colorsKey = typeof recordColor === 'function' && !(colorColumn && colorChoices) ? rowRecords.map((r) => colorOf(r) ?? '').join('\\n') : null;\n const urlsKey = typeof recordUrl === 'function' ? rowRecords.map((r) => urlOfRecord(recordUrl, r) ?? '').join('\\n') : null;\n const rowFunctions = useRef({ colorOf, recordUrl });\n rowFunctions.current = { colorOf, recordUrl };\n const recordItems = useMemo(\n () =>\n currentRows\n ? recordMarkers(currentRows.response, {\n latitudeColumn,\n longitudeColumn,\n titleColumn: recordTitleColumn,\n color: (record) => rowFunctions.current.colorOf(record),\n url: (record) => urlOfRecord(rowFunctions.current.recordUrl, record),\n })\n : [],\n [\n currentRows,\n latitudeColumn,\n longitudeColumn,\n recordTitleColumn,\n typeof recordColor === 'function' ? colorsKey : recordColor,\n colorColumn,\n colorChoices,\n typeof recordUrl === 'function' ? urlsKey : recordUrl,\n ],\n );\n\n // The options shown, each with its color and the label a row of it has, in the column's order.\n const legend = useMemo(() => {\n if (!colorColumn || !colorChoices || !showLegend) return [];\n const entries = new globalThis.Map<number | null, { label: string; color: string }>();\n for (const marker of recordItems) {\n const record = marker.data!.record;\n const value = optionValue(record, colorColumn);\n if (entries.has(value)) continue;\n const label = value === null ? t('no-value') : resolveColumnDisplayValue(record, colorColumn) || `${value}`;\n entries.set(value, { label, color: optionColor(colorChoices, value) });\n }\n return [...entries]\n .sort(([a], [b]) => {\n const [x, y] = [optionOrder(colorChoices, a), optionOrder(colorChoices, b)];\n return x[0] - y[0] || x[1] - y[1];\n })\n .map(([value, entry]) => ({ value, ...entry }));\n }, [colorColumn, colorChoices, showLegend, recordItems, t]);\n // The rows of the tables registered for maps, each table's in its color, as the toolbar over the\n // map reads them.\n const [tablesRead, setTablesRead] = useState<MapTablesState | null>(null);\n const mapTables: MapTablesState = multiTable ? (tablesRead ?? TABLES_LOADING) : NO_TABLES;\n const tableColorOf = (table: string) => mapTables.colors[table] ?? mapTables.colors[table.toLowerCase()] ?? undefined;\n const placeColorsKey = JSON.stringify(mapTables.colors);\n const placeItems = useMemo<MapItem<MapRecord>[]>(\n () =>\n mapTables.places.map((place) => {\n const color = (typeof recordColor === 'function' ? recordColor(place.record) : undefined) ?? tableColorOf(place.table);\n const url = urlOfRecord(recordUrl, place.record);\n return {\n kind: 'marker' as const,\n id: `${place.table}:${place.id}`,\n position: { latitude: Number(place.latitude), longitude: Number(place.longitude) },\n ...(place.title.value ? { title: place.title.value } : {}),\n ...(color ? { color } : {}),\n ...(url ? { url } : {}),\n data: { record: place.record, columns: [], place },\n };\n }),\n // The colors are in their key; a row function's answers change with the rows.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [mapTables.places, placeColorsKey, typeof recordColor === 'function' ? colorsKey : null, typeof recordUrl === 'function' ? urlsKey : recordUrl],\n );\n // The place the rows are near: its circle, and its pin.\n const nearKey = mapTables.near ? JSON.stringify(mapTables.near) : null;\n const nearItems = useMemo<MapItem<TData | MapRecord>[]>(\n () => (mapTables.near ? (nearPlaceItems(mapTables.near) as MapItem<TData | MapRecord>[]) : []),\n // The place is in its key.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [nearKey],\n );\n const allItems = useMemo<MapItem<TData | MapRecord>[]>(\n () => [...(items ?? []), ...recordItems, ...placeItems, ...nearItems],\n [items, recordItems, placeItems, nearItems],\n );\n const itemsById = useMemo(() => new globalThis.Map(allItems.map((item) => [item.id, item])), [allItems]);\n const itemsRef = useRef(itemsById);\n itemsRef.current = itemsById;\n const allItemsRef = useRef(allItems);\n allItemsRef.current = allItems;\n\n // ---- The map ----\n\n const camera: MapCamera | undefined = center ? { center, zoom: zoom ?? 12 } : undefined;\n const options = {\n provider,\n // The provider's keys and the settings the page leaves unset come from the portal.\n portalSettings: (name: string | undefined) => portalSettingsCache(ppp).get(name, (asked) => ppp.getMapSettingsAsync(asked)),\n style: mapStyle,\n camera,\n cluster,\n usePortalTheme,\n language: locale,\n nativeOptions,\n clusterLabel: (count: number) => latest.current.t('cluster', [count]),\n gestureHelp: { windows: t('scroll-zoom'), mac: t('scroll-zoom-mac'), mobile: t('touch-pan') },\n addressSearch: showAddressSearch\n ? {\n placeholder: t('search-placeholder'),\n clear: t('search-clear'),\n searching: t('searching'),\n noResults: t('search-no-results'),\n failed: t('search-failed'),\n countries: addressSearchCountries,\n }\n : null,\n address,\n };\n const optionsRef = useRef(options);\n optionsRef.current = options;\n\n const openItem = (id: string, position?: MapPosition) => {\n const item = itemsRef.current.get(id);\n if (!item) return;\n setPopup({ kind: 'item', item, position: position ?? (item.kind === 'marker' ? item.position : popupPosition(item)) });\n };\n\n const optionsKey = JSON.stringify([\n provider ?? null,\n mapStyle,\n cluster,\n usePortalTheme,\n locale,\n nativeOptions ?? null,\n // Its words too, which can come after the map is drawn, as the strings load.\n options.addressSearch,\n options.gestureHelp,\n address?.trim() ?? '',\n ]);\n const optionsKeyRef = useRef(optionsKey);\n optionsKeyRef.current = optionsKey;\n // The options the controller has: those it was made with, then each change sent to it.\n const appliedOptions = useRef<string | null>(null);\n\n useEffect(() => {\n const container = hostRef.current;\n if (!container) return;\n\n let disposed = false;\n let created: MapController | null = null;\n appliedOptions.current = optionsKeyRef.current;\n void MapController.create(container, optionsRef.current, allItemsRef.current, {\n mapClick: (event) => {\n setPopup(null);\n latest.current.onMapClick?.(event);\n },\n itemClick: ({ id, position }) => {\n // The circle around a place is the map's ground, not something to open.\n if (id.startsWith(NEAR_CIRCLE_ID)) {\n setPopup(null);\n latest.current.onMapClick?.({ position });\n return;\n }\n const item = itemsRef.current.get(id);\n if (!item) return;\n const event = itemClick(item, position);\n latest.current.onItemClick?.(event);\n if (latest.current.showPopups && !event.defaultPrevented) setPopup({ kind: 'item', item, position });\n },\n // Listed even with popups off: markers at one place can be told apart no other way.\n clusterClick: ({ ids, position }) => {\n const listed = ids.map((id) => itemsRef.current.get(id)).filter((item) => item !== undefined);\n if (listed.length) setPopup({ kind: 'list', items: listed, position });\n },\n viewChanged: (view) => latest.current.onViewChanged?.(view),\n addressSelected: (place) => latest.current.onAddressSelected?.(place),\n addressStatus: setAddressStatus,\n error: (kind, message) => {\n setFailure({ kind, message });\n latest.current.onError?.(message);\n },\n }).then(\n (controller) => {\n created = controller;\n if (disposed) {\n controller.dispose();\n return;\n }\n controllerRef.current = controller;\n setCanSaveImage(controller.canSaveImage);\n setReady(true);\n },\n (error: unknown) => {\n if (disposed) return;\n const message = error instanceof Error ? error.message : String(error);\n setFailure({ kind: 'failed', message });\n latest.current.onError?.(message);\n },\n );\n\n return () => {\n disposed = true;\n created?.dispose();\n controllerRef.current = null;\n setReady(false);\n };\n // Drawn once; changes reach the controller through the effects below.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // The items: the view fitted to them when they first arrive, and again when the rows of a\n // different view or query have come — not before, which would fit the page's own items alone —\n // unless the page set where to look.\n const fittedSource = useRef<string | null>(null);\n const rowsSettled = (!requestKey || !!currentRows || rowsFailed) && (!multiTable || !mapTables.loading);\n // The chosen items the view is kept on, as text, and as last fitted.\n const fitKey = fitItemIds ? fitItemIds.join(',') : null;\n const fitItemIdsRef = useRef(fitItemIds);\n fitItemIdsRef.current = fitItemIds;\n const fittedKey = useRef<string | null>(null);\n // The ids of the items the view was last fitted among: a fit is due again once one is gone.\n const fittedAmong = useRef<ReadonlySet<string>>(new Set());\n useEffect(() => {\n const controller = controllerRef.current;\n if (!controller) return;\n if (fitItemIdsRef.current) {\n controller.setItems(allItems, false);\n const gone = fittedAmong.current.size === 0 || [...fittedAmong.current].some((id) => !itemsById.has(id));\n if (gone) {\n controller.fitToItems(fitItemIdsRef.current);\n fittedKey.current = fitKey;\n fittedAmong.current = new Set(itemsById.keys());\n }\n } else {\n const source = rowsSettled ? `${requestKey ?? ''}|${multiTable ? mapTables.fitKey : ''}|${allItems.length > 0}` : null;\n // A place to be near is fitted to, wherever the page set the map to look.\n const fit = (!center || !!mapTables.near) && allItems.length > 0 && source !== null && fittedSource.current !== source;\n if (fit) fittedSource.current = source;\n controller.setItems(allItems, fit);\n }\n setPopup((open) => {\n if (open?.kind === 'item') return itemsById.has(open.item.id) ? open : null;\n // A cluster's list goes when any of its items has.\n if (open?.kind === 'list') return open.items.every((item) => itemsById.has(item.id)) ? open : null;\n return open;\n });\n // `center` only decides whether to fit, not when.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [ready, allItems, itemsById, requestKey, rowsSettled]);\n\n useEffect(() => {\n if (!ready || fitKey === null || fitKey === fittedKey.current) return;\n fittedKey.current = fitKey;\n fittedAmong.current = new Set(itemsRef.current.keys());\n controllerRef.current?.fitToItems(fitItemIdsRef.current);\n }, [ready, fitKey]);\n\n useEffect(() => {\n if (!ready || optionsKey === appliedOptions.current) return;\n appliedOptions.current = optionsKey;\n setFailure(null);\n const controller = controllerRef.current;\n // Another provider may copy its map, or not; a failure is reported through the map's own error.\n const update = () => controller && setCanSaveImage(controller.canSaveImage);\n void controller?.setOptions(optionsRef.current).then(update, update);\n }, [ready, optionsKey]);\n\n const cameraKey = camera ? JSON.stringify(camera) : null;\n const shownCamera = useRef(cameraKey);\n useEffect(() => {\n if (!ready || !camera || cameraKey === shownCamera.current) return;\n shownCamera.current = cameraKey;\n controllerRef.current?.setCamera(camera, true);\n // The camera is in its key.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [ready, cameraKey]);\n\n // What is printed with the map, as it is now: its legends, and the page's heading and records.\n const printLegend: MapLegendEntry[] = [\n ...mapTables.legend.map((entry) => ({ label: entry.label, color: entry.color })),\n ...legend.map((entry) => ({ label: entry.label, color: entry.color })),\n ];\n const printRef = useRef({ legend: printLegend, title: printTitle ?? title, entries: printEntries, onError });\n printRef.current = { legend: printLegend, title: printTitle ?? title, entries: printEntries, onError };\n // The popup open on the map, as its image shows it: made as the map is printed, from the popup set\n // further down.\n const printPopupRef = useRef<() => MapPrintPopup | undefined>(() => undefined);\n\n // One printout or image at a time; a failure is the page's to hear of, through onError.\n const printingRef = useRef(false);\n const runPrintJob = async <T,>(job: (controller: MapController) => Promise<T>): Promise<T | undefined> => {\n const controller = controllerRef.current;\n // A second while one is under way would copy the map at the first's sharpness and keep it.\n if (!controller || printingRef.current) return undefined;\n printingRef.current = true;\n setPrinting(true);\n try {\n return await job(controller);\n } catch (error) {\n printRef.current.onError?.(error instanceof Error ? error.message : String(error));\n return undefined;\n } finally {\n printingRef.current = false;\n setPrinting(false);\n }\n };\n const printMap = () =>\n runPrintJob((controller) => {\n const { legend: shown, title: heading, entries: listed } = printRef.current;\n const entries = typeof listed === 'function' ? listed() : listed;\n const popup = printPopupRef.current();\n return controller.print({\n ...(heading && { title: heading }),\n ...(shown.length && { legend: shown }),\n ...(entries?.length && { entries }),\n ...(popup && { popup }),\n });\n }).then(() => undefined);\n const saveMapImage = async (fileName?: string) =>\n (await runPrintJob((controller) =>\n controller.saveImage(fileName ?? printRef.current.title ?? 'map', printRef.current.legend, printPopupRef.current()),\n )) ?? false;\n\n // The page told whenever printing becomes possible or changes, and that it isn't once the map goes.\n const printable = ready && !failure;\n const onPrintChangeRef = useRef(onPrintChange);\n onPrintChangeRef.current = onPrintChange;\n const reportsPrint = !!onPrintChange;\n useEffect(() => {\n onPrintChangeRef.current?.(\n printable ? { canSaveImage, printing, print: () => void printMap(), saveImage: () => void saveMapImage() } : null,\n );\n // printMap and saveMapImage read the map and what is printed through refs. A callback given\n // after the map is up is told too.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [printable, canSaveImage, printing, reportsPrint]);\n useEffect(() => () => onPrintChangeRef.current?.(null), []);\n\n useImperativeHandle(\n ref,\n () => ({\n setCamera: (target, animate = true) => controllerRef.current?.setCamera(target, animate),\n fitToItems: (ids) => controllerRef.current?.fitToItems(ids),\n openPopup: (id) => openItem(id),\n closePopup: () => setPopup(null),\n goToAddress: async (text) => (await controllerRef.current?.goToAddress(text)) ?? null,\n clearAddress: () => controllerRef.current?.clearAddress(),\n getView: () => controllerRef.current?.getView() ?? null,\n print: printMap,\n saveImage: saveMapImage,\n get native() {\n return controllerRef.current?.native ?? null;\n },\n }),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [],\n );\n\n const closePopup = () => {\n const id = popup?.kind === 'item' ? popup.item.id : null;\n setPopup(null);\n if (id) controllerRef.current?.focusMarker(id);\n };\n\n const onPopupKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n event.stopPropagation();\n closePopup();\n }\n };\n\n const popupContent = (() => {\n if (!popup) return null;\n if (popup.kind === 'list') {\n return (\n <PopupCard title={t('cluster-list', [popup.items.length])} closeLabel={t('close')} onClose={closePopup}>\n <ul className={styles.list}>\n {popup.items.map((item) => (\n <li key={item.id}>\n <Button\n appearance=\"subtle\"\n size=\"small\"\n className={styles.listButton}\n onClick={() => {\n const event = itemClick(item, popup.position);\n latest.current.onItemClick?.(event);\n setPopup(latest.current.showPopups && !event.defaultPrevented ? { kind: 'item', item, position: popup.position } : null);\n }}\n >\n {item.title || t('untitled')}\n </Button>\n </li>\n ))}\n </ul>\n </PopupCard>\n );\n }\n\n const item = popup.item;\n const custom = renderPopup?.(item);\n if (renderPopup && (custom === null || custom === undefined || custom === false)) return null;\n if (custom !== undefined && custom !== null) {\n return (\n <PopupCard label={item.title} closeLabel={t('close')} onClose={closePopup}>\n {custom}\n </PopupCard>\n );\n }\n // The item's own page, else — for a row the map read — its record's.\n const href = item.url ?? (isRecord(item.data) ? recordPageOf(item.data) : undefined);\n const link = href ? { href, onNavigate: (url: string) => latest.current.onNavigate?.(url), navigates: !!onNavigate } : undefined;\n if (isRecord(item.data)) {\n return (\n <PopupCard title={item.title || t('untitled')} link={link} closeLabel={t('close')} onClose={closePopup}>\n <PopupFields\n fields={popupFields(item.data, recordTitleColumn)}\n distance={\n item.data.place?.distance != null && mapTables.near\n ? t('distance-away', [\n t(mapTables.near.unit === DistanceUnits.Kilometers ? 'distance-kilometers' : 'distance-miles', [\n formatDistance(Number(item.data.place.distance), locale),\n ]),\n ])\n : undefined\n }\n />\n </PopupCard>\n );\n }\n return item.title ? <PopupCard title={item.title} link={link} closeLabel={t('close')} onClose={closePopup} /> : null;\n })();\n\n // The popup is placed once it has rendered, and follows the map from there. One whose content\n // came to nothing isn't opened at all.\n const shownPopup = popup && popupContent ? popup : null;\n printPopupRef.current = () => {\n if (!shownPopup) return undefined;\n if (shownPopup.kind === 'list') {\n return { title: t('cluster-list', [shownPopup.items.length]), items: shownPopup.items.map((item) => item.title || t('untitled')) };\n }\n const item = shownPopup.item;\n // The page's own content can't be drawn: what it shows is read from the popup as it is printed.\n if (renderPopup) return { fromPage: true };\n if (isRecord(item.data)) {\n const details = popupFields(item.data, recordTitleColumn).map(({ label, value }) => ({ label, value }));\n return { title: item.title || t('untitled'), ...(details.length && { details }) };\n }\n return item.title ? { title: item.title } : undefined;\n };\n useLayoutEffect(() => {\n const controller = controllerRef.current;\n const element = popupRef.current;\n if (!controller || !element) return;\n if (!shownPopup) {\n controller.hidePopup();\n controller.select(null);\n return;\n }\n const kind = shownPopup.kind === 'item' ? itemKind(shownPopup.item) : 'marker';\n controller.showPopup(element, shownPopup.position, kind);\n controller.select(shownPopup.kind === 'item' ? shownPopup.item.id : null);\n }, [shownPopup, ready]);\n\n const truncated = currentRows?.response.pagingInfo?.moreRecords === true;\n const failureText = failure\n ? failure.kind === 'unknown-provider'\n ? t('unknown-provider', [failure.message])\n : t('failed')\n : null;\n // How finding the page's address goes, while it names one.\n const shownAddressStatus = address?.trim() ? addressStatus : null;\n\n // The Print button: on the toolbar of a map of several tables, else over the top right corner. Not\n // until the map is up, nor once it has failed.\n const printButton = (inToolbar: boolean) =>\n showPrintButton &&\n printable && (\n <MapPrintButton\n inToolbar={inToolbar}\n {...(!inToolbar && { className: styles.printButton })}\n canSaveImage={canSaveImage}\n disabled={printing}\n onPrint={() => void printMap()}\n onSaveImage={() => void saveMapImage()}\n />\n );\n const printsOverMap = showPrintButton && !multiTable;\n\n const mapElement = (\n <div\n ref={rootRef}\n className={mergeClasses('ppp-map', printsOverMap && 'ppp-map-printable', styles.root, className)}\n style={{ height: cssLength(height), width: cssLength(width), ...style }}\n >\n <SharedTooltip containerRef={rootRef} />\n <div ref={hostRef} className=\"ppp-map-host\" />\n {printsOverMap && printable && <div className=\"ppp-map-print\">{printButton(false)}</div>}\n <div className=\"ppp-map-popup-layer\">\n <div\n ref={popupRef}\n className=\"ppp-map-popup-anchor\"\n hidden={!popupContent}\n onKeyDown={onPopupKeyDown}\n // Clicks inside the popup are its own, not the map's.\n onClick={(event) => event.stopPropagation()}\n >\n {popupContent}\n </div>\n </div>\n\n {(!ready || shownAddressStatus === 'searching') && !failure && (\n <div className={styles.overlay}>\n <Spinner size=\"small\" label={ready ? t('finding-address') : t('loading')} />\n </div>\n )}\n\n {failureText || rowsFailed || mapTables.failed ? (\n <div className={styles.message}>\n <MessageBar intent=\"error\">\n <MessageBarBody>{failureText ?? t('rows-failed')}</MessageBarBody>\n </MessageBar>\n </div>\n ) : (\n (shownAddressStatus === 'not-found' || shownAddressStatus === 'failed') && (\n <div className={styles.message}>\n <MessageBar intent={shownAddressStatus === 'failed' ? 'error' : 'warning'}>\n <MessageBarBody>{t(shownAddressStatus === 'failed' ? 'address-failed' : 'address-not-found')}</MessageBarBody>\n </MessageBar>\n </div>\n )\n )}\n\n {(legend.length > 0 || mapTables.legend.length > 0 || truncated) && (\n <div className={styles.corner}>\n {mapTables.legend.length > 0 && (\n <ul className={mergeClasses('ppp-map-legend', styles.legend)} aria-label={t('legend')}>\n {mapTables.legend.map((entry) => (\n <li key={entry.table} className={styles.legendItem}>\n <span className={styles.legendDot} style={{ backgroundColor: entry.color }} />\n <Text size={200}>{entry.label}</Text>\n {entry.note && (\n <Text size={200} className={styles.legendNote}>\n {entry.note}\n </Text>\n )}\n </li>\n ))}\n </ul>\n )}\n {legend.length > 0 && (\n <ul className={mergeClasses('ppp-map-legend', styles.legend)} aria-label={t('legend')}>\n {legend.map((entry) => (\n <li key={entry.value ?? 'none'} className={styles.legendItem}>\n <span className={styles.legendDot} style={{ backgroundColor: entry.color }} />\n <Text size={200}>{entry.label}</Text>\n </li>\n ))}\n </ul>\n )}\n {truncated && (\n <Text size={200} className={styles.note}>\n {t('rows-truncated', [recordItems.length])}\n </Text>\n )}\n </div>\n )}\n </div>\n );\n\n if (!multiTable) return mapElement;\n return (\n <div className={mergeClasses('ppp-map-frame', styles.frame)}>\n <MapTablesBar\n tables={tables}\n defaultTables={defaultTables}\n defaultViewId={defaultViewId}\n viewIds={viewIds}\n regarding={regarding}\n allowFiltering={allowFiltering}\n allowSavedViews={allowSavedViews}\n savedViewsKey={savedViewsKey}\n signInUrl={signInUrl}\n title={title}\n allowNearSearch={allowNearSearch}\n nearDistances={nearDistances}\n nearDistance={nearDistance}\n nearDistanceUnit={nearDistanceUnit}\n provider={provider}\n addressSearchCountries={addressSearchCountries}\n toolbarActions={printButton(true)}\n onState={setTablesRead}\n />\n {mapElement}\n </div>\n );\n}\n\n// Where a shape's popup opens when it is opened by id rather than by a click: its middle.\nfunction popupPosition(item: MapItem<unknown>): MapPosition {\n if (item.kind === 'circle') return item.center;\n if (item.kind === 'marker') return item.position;\n const path = item.path;\n const latitude = path.reduce((sum, position) => sum + position.latitude, 0) / Math.max(1, path.length);\n const longitude = path.reduce((sum, position) => sum + position.longitude, 0) / Math.max(1, path.length);\n return { latitude, longitude };\n}\n\n/**\n * A popup: the close button beside its title — or, without one, beside the page's own content,\n * which takes the title's place rather than starting under an empty row.\n */\nfunction PopupCard({\n title,\n link,\n label,\n closeLabel,\n onClose,\n children,\n}: {\n title?: string;\n /** Where the title links to, and the page's own way of following it. */\n link?: { href: string; onNavigate: (url: string) => void; navigates: boolean } | undefined;\n /** Its accessible name when it has no title. */\n label?: string | undefined;\n closeLabel: string;\n onClose: () => void;\n children?: ReactNode;\n}) {\n const styles = useStyles();\n // A plain left click goes the page's way when it has one; others — a new tab — stay the browser's.\n const onLinkClick = (event: MouseEvent<HTMLAnchorElement>) => {\n if (!link?.navigates || event.defaultPrevented || event.button !== 0 || event.metaKey || event.ctrlKey || event.shiftKey || event.altKey) return;\n event.preventDefault();\n link.onNavigate(link.href);\n };\n return (\n <Card className={mergeClasses('ppp-map-popup', styles.popup)} size=\"small\" role=\"dialog\" aria-label={title ?? label}>\n <div className={styles.popupHeader}>\n {title ? (\n <div className={styles.popupTitle}>\n {link ? (\n <Link href={link.href} onClick={onLinkClick}>\n <Text weight=\"semibold\">{title}</Text>\n </Link>\n ) : (\n <Text weight=\"semibold\">{title}</Text>\n )}\n </div>\n ) : (\n <div className={styles.popupBody}>{children}</div>\n )}\n <Button\n className=\"ppp-map-popup-close\"\n appearance=\"subtle\"\n size=\"small\"\n icon={<Dismiss16Regular />}\n aria-label={closeLabel}\n data-ppp-tooltip={closeLabel}\n onClick={onClose}\n />\n </div>\n {title ? children : null}\n </Card>\n );\n}\n\n/**\n * What a row's popup lists, at most eight: a table's row's columns as its view's query shows them,\n * or a row's view columns other than the one naming it.\n */\nfunction popupFields(record: MapRecord, titleColumn: string | undefined): PopupField[] {\n const fields = record.place\n ? (record.place.details ?? []).map((field) => ({ key: field.column, label: field.label, value: field.value }))\n : record.columns\n .filter((column) => column.columnName !== titleColumn)\n .map((column) => ({\n key: column.columnName,\n label: column.displayName,\n value: resolveColumnDisplayValue(record.record, column.columnName),\n }));\n return fields.filter((field): field is PopupField => !!field.value?.trim()).slice(0, 8);\n}\n\ninterface PopupField {\n key: string;\n label: string;\n value: string;\n}\n\n/** A popup's fields, as a short list of names and values — and how far its row is from a place it is near. */\nfunction PopupFields({ fields, distance }: { fields: readonly PopupField[]; distance?: string | undefined }) {\n const styles = useStyles();\n if (!fields.length && !distance) return null;\n return (\n <>\n {distance && (\n <Text size={200} className={mergeClasses('ppp-map-popup-distance', styles.fieldName)}>\n {distance}\n </Text>\n )}\n {fields.length > 0 && (\n <dl className={styles.fields}>\n {fields.map((field) => (\n <div key={field.key} style={{ display: 'contents' }}>\n <dt className={styles.fieldName}>\n <Text size={200}>{field.label}</Text>\n </dt>\n <dd className={styles.fieldValue}>\n <Text size={200}>{field.value}</Text>\n </dd>\n </div>\n ))}\n </dl>\n )}\n </>\n );\n}\n\n/**\n * A map of Dataverse rows and items of the page's own, drawn by Azure Maps, Esri, Google,\n * OpenStreetMap or any MapLibre style — the portal's own provider unless `provider` names another,\n * each with the keys in the portal's `PowerPortalsPro:Maps` settings. Rows come from a view or\n * FetchXML, each at its latitude and longitude, read with the user's permissions as a grid's are,\n * and colored by a column's options with `colorColumn`. Clicking an item calls `onItemClick`, then\n * opens a popup — its row's columns by default, or what `renderPopup` returns — unless the page\n * prevented it. `showAddressSearch` adds a box for finding an address with the provider's search.\n */\nexport const Map = forwardRef(MapImpl) as <TData = unknown>(\n props: MapProps<TData> & RefAttributes<MapHandle>,\n) => ReactElement | null;\n","import type { GridMapProps } from '@powerportalspro/react-fluent';\nimport { useMemo } from 'react';\nimport type { MapItem, MapMarker, MapView } from './core/index.js';\nimport { Map } from './map.js';\nimport { nearCircleId, nearPlaceItems } from './near-search.js';\n\n/**\n * The color of a place: one the address search finds, as its pin is drawn, a row a grid's map focuses\n * and the address the address dialog shows. Blazor's `Map.PlaceColor`.\n */\nexport const PLACE_PIN_COLOR = 'var(--colorPaletteRedBackground3, #d13438)';\n\n/**\n * The map of a grid's `GridLayout.Map` layout: the rows it shows as pins, the view kept on the\n * selected ones — or the one last clicked, or every pin. What `<MapsProvider>` gives the grid; the\n * twin of Blazor's `GridMap`.\n */\nexport function GridMap({ pins, focusedIds, onPinClick, onNavigate, onPrintChange, printTitle, printEntries, near, onViewChange }: GridMapProps) {\n const focusKey = focusedIds.join(',');\n const pinsKey = JSON.stringify(pins);\n const nearKey = near ? JSON.stringify(near) : '';\n // Made again only when the pins or the ones focused change, so the map is handed nothing new\n // otherwise.\n const items = useMemo<MapItem[]>(() => {\n const focused = new Set(focusedIds);\n const markers = pins.map((pin): MapMarker => ({\n kind: 'marker',\n id: pin.id,\n position: { latitude: pin.latitude, longitude: pin.longitude },\n ...(pin.title && { title: pin.title }),\n ...(pin.url && { url: pin.url }),\n ...(pin.label && { label: pin.label }),\n ...(focused.has(pin.id) && { color: PLACE_PIN_COLOR }),\n }));\n // Near a place, its circle: the map is fitted to it unless records are focused.\n return near ? [...markers, ...nearPlaceItems(near)] : markers;\n // The pins, the focused ids and the place are in their keys.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [pinsKey, focusKey, nearKey]);\n // The focused records — or, with none, the circle around a place, which holds its records, fitted\n // again for each new one; else every pin.\n const fitItemIds = useMemo(\n () => (focusedIds.length > 0 ? [...focusedIds] : near ? [nearCircleId(near)] : []),\n [focusKey, nearKey], // eslint-disable-line react-hooks/exhaustive-deps\n );\n\n return (\n <Map\n className=\"ppp-grid-map\"\n items={items}\n fitItemIds={fitItemIds}\n height=\"100%\"\n onItemClick={(event) => onPinClick(event.item.id)}\n {...(onNavigate && { onNavigate })}\n {...(onPrintChange && { onPrintChange })}\n {...(printTitle && { printTitle })}\n {...(printEntries && { printEntries })}\n {...(onViewChange && { onViewChanged: (view: MapView) => onViewChange(view.bounds) })}\n />\n );\n}\n","import {\n Button,\n Dialog,\n DialogActions,\n DialogBody,\n DialogContent,\n DialogSurface,\n DialogTitle,\n makeStyles,\n Text,\n tokens,\n} from '@fluentui/react-components';\nimport { useT } from '@powerportalspro/react';\nimport {\n AddressMapServiceContext,\n GridMapRendererContext,\n GridNearSearchContext,\n type AddressMapRequest,\n type AddressMapService,\n} from '@powerportalspro/react-fluent';\nimport { useMemo, useState, type ReactNode } from 'react';\nimport type { MapMarker } from './core/index.js';\nimport { GridMap, PLACE_PIN_COLOR } from './grid-map.js';\nimport { Map } from './map.js';\nimport { NearSearch } from './near-search.js';\n\nconst useStyles = makeStyles({\n surface: {\n width: `min(800px, calc(100vw - ${tokens.spacingHorizontalXXXL}))`,\n maxWidth: 'none',\n },\n content: {\n display: 'flex',\n flexDirection: 'column',\n rowGap: tokens.spacingVerticalS,\n },\n address: {\n color: tokens.colorNeutralForeground2,\n },\n});\n\nexport interface MapsProviderProps {\n children?: ReactNode;\n}\n\n/**\n * Gives the controls of `@powerportalspro/react-fluent` that show a map this package's maps: the\n * pin of `<AddressDisplayValue showMap>`, which opens the address on a map in a dialog, a grid's\n * `GridLayout.Map`, and a grid's Near button (`allowNearSearch`). Put it once\n * around the app, inside `<PowerPortalsProProvider>` and the theme provider, as the dialog and\n * overlay providers are.\n *\n * ```tsx\n * <PowerPortalsProProvider>\n * <FluentDialogProvider>\n * <MapsProvider>\n * <RouterProvider router={router} />\n * </MapsProvider>\n * </FluentDialogProvider>\n * </PowerPortalsProProvider>\n * ```\n */\nexport function MapsProvider({ children }: MapsProviderProps) {\n const [request, setRequest] = useState<AddressMapRequest | null>(null);\n const service = useMemo<AddressMapService>(() => ({ show: setRequest }), []);\n return (\n <AddressMapServiceContext.Provider value={service}>\n <GridMapRendererContext.Provider value={GridMap}>\n <GridNearSearchContext.Provider value={NearSearch}>\n {children}\n {request && <AddressMapDialog request={request} onClose={() => setRequest(null)} />}\n </GridNearSearchContext.Provider>\n </GridMapRendererContext.Provider>\n </AddressMapServiceContext.Provider>\n );\n}\n\n/**\n * An address on a map, in a dialog: pinned at its coordinates when the request has them, and\n * otherwise found with the map provider's search as the dialog opens, the map's spinner showing\n * while it looks. The twin of Blazor's `AddressMapDialog`.\n */\nfunction AddressMapDialog({ request, onClose }: { request: AddressMapRequest; onClose: () => void }) {\n const styles = useStyles();\n const t = useT();\n const oneLine = request.lines.join(', ');\n const { position } = request;\n const items = useMemo<MapMarker[]>(\n () =>\n position\n ? [{ kind: 'marker', id: 'address', position, title: oneLine || request.query, color: PLACE_PIN_COLOR }]\n : [],\n [position, oneLine, request.query],\n );\n\n return (\n <Dialog open onOpenChange={(_, data) => (data.open ? undefined : onClose())}>\n <DialogSurface className={`ppp-address-map-dialog ${styles.surface}`}>\n <DialogBody>\n <DialogTitle>{request.title}</DialogTitle>\n <DialogContent className={styles.content}>\n {oneLine && <Text className={styles.address}>{oneLine}</Text>}\n <Map items={items} {...(position ? {} : { address: request.query })} height=\"min(60vh, 480px)\" />\n </DialogContent>\n <DialogActions>\n <Button appearance=\"primary\" onClick={onClose}>\n {t('app.buttons.close.label')}\n </Button>\n </DialogActions>\n </DialogBody>\n </DialogSurface>\n </Dialog>\n );\n}\n"]}