@macrostrat/map-interface 1.0.2 → 1.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +13 -4
- package/dist/main.js +9 -10
- package/dist/main.js.map +1 -1
- package/dist/module.js +9 -10
- package/dist/module.js.map +1 -1
- package/package.json +7 -6
- package/dist/main.css +0 -951
- package/dist/main.css.map +0 -1
- package/dist/module.css +0 -951
- package/dist/module.css.map +0 -1
- package/dist/types.d.ts +0 -260
- package/dist/types.d.ts.map +0 -1
package/dist/module.js
CHANGED
|
@@ -776,12 +776,12 @@ const $4bdfa9cd8240b2fd$export$ec68dd77edbe678b = (props)=>$4bdfa9cd8240b2fd$var
|
|
|
776
776
|
...props,
|
|
777
777
|
className: (0, $Zz0sd$classnames)("panel-card", props.className)
|
|
778
778
|
});
|
|
779
|
-
|
|
779
|
+
var $4bdfa9cd8240b2fd$export$612ca936d3ed4784;
|
|
780
|
+
(function(DetailPanelStyle) {
|
|
780
781
|
DetailPanelStyle["FIXED"] = "fixed";
|
|
781
782
|
DetailPanelStyle["FLOATING"] = "floating";
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
function $4bdfa9cd8240b2fd$var$_MapAreaContainer({ children: children, className: className, navbar: navbar, contextPanel: contextPanel = null, detailPanel: detailPanel = null, detailPanelOpen: detailPanelOpen, contextPanelOpen: contextPanelOpen = true, bottomPanel: bottomPanel = null, mainPanel: mainPanel, mapControls: mapControls = $4bdfa9cd8240b2fd$var$h((0, $91d5aa004eeb2226$export$db1a2e058a06fb5c)), contextStackProps: contextStackProps = null, detailStackProps: detailStackProps = null, detailPanelStyle: detailPanelStyle = $4bdfa9cd8240b2fd$export$612ca936d3ed4784.FLOATING, fitViewport: fitViewport = true, showPanelOutlines: showPanelOutlines = false, preventMapInteraction: preventMapInteraction = false, ...rest }) {
|
|
783
|
+
})($4bdfa9cd8240b2fd$export$612ca936d3ed4784 || ($4bdfa9cd8240b2fd$export$612ca936d3ed4784 = {}));
|
|
784
|
+
function $4bdfa9cd8240b2fd$var$_MapAreaContainer({ children: children, className: className, navbar: navbar, contextPanel: contextPanel = null, detailPanel: detailPanel = null, detailPanelOpen: detailPanelOpen, contextPanelOpen: contextPanelOpen = true, bottomPanel: bottomPanel = null, mainPanel: mainPanel, mapControls: mapControls = $4bdfa9cd8240b2fd$var$h((0, $91d5aa004eeb2226$export$db1a2e058a06fb5c)), contextStackProps: contextStackProps = null, detailStackProps: detailStackProps = null, detailPanelStyle: detailPanelStyle = "floating", fitViewport: fitViewport = true, showPanelOutlines: showPanelOutlines = false, preventMapInteraction: preventMapInteraction = false, ...rest }) {
|
|
785
785
|
const _detailPanelOpen = detailPanelOpen ?? detailPanel != null;
|
|
786
786
|
const contextPanelTrans = (0, $Zz0sd$useTransition)(contextPanelOpen, 800);
|
|
787
787
|
const detailPanelTrans = (0, $Zz0sd$useTransition)(_detailPanelOpen, 800);
|
|
@@ -807,7 +807,7 @@ function $4bdfa9cd8240b2fd$var$_MapAreaContainer({ children: children, className
|
|
|
807
807
|
]);
|
|
808
808
|
const detailStackExt = $4bdfa9cd8240b2fd$var$h("div.detail-stack.infodrawer-container", detailStackProps, [
|
|
809
809
|
$4bdfa9cd8240b2fd$var$h("div.detail-panel-holder", null, detailPanel),
|
|
810
|
-
$4bdfa9cd8240b2fd$var$h.if(detailPanelStyle ==
|
|
810
|
+
$4bdfa9cd8240b2fd$var$h.if(detailPanelStyle == "floating")([
|
|
811
811
|
mapControlsExt
|
|
812
812
|
])
|
|
813
813
|
]);
|
|
@@ -828,12 +828,12 @@ function $4bdfa9cd8240b2fd$var$_MapAreaContainer({ children: children, className
|
|
|
828
828
|
]),
|
|
829
829
|
//h(MapView),
|
|
830
830
|
children ?? mainPanel,
|
|
831
|
-
$4bdfa9cd8240b2fd$var$h.if(detailPanelStyle ==
|
|
831
|
+
$4bdfa9cd8240b2fd$var$h.if(detailPanelStyle == "floating")([
|
|
832
832
|
detailStackExt
|
|
833
833
|
]),
|
|
834
|
-
$4bdfa9cd8240b2fd$var$h.if(detailPanelStyle ==
|
|
834
|
+
$4bdfa9cd8240b2fd$var$h.if(detailPanelStyle == "fixed")("div.map-control-stack", mapControlsExt)
|
|
835
835
|
]),
|
|
836
|
-
$4bdfa9cd8240b2fd$var$h.if(detailPanelStyle ==
|
|
836
|
+
$4bdfa9cd8240b2fd$var$h.if(detailPanelStyle == "fixed")([
|
|
837
837
|
detailStackExt
|
|
838
838
|
])
|
|
839
839
|
]),
|
|
@@ -1050,8 +1050,7 @@ function $4bc3dd5f0732eed3$export$5c90a91c7455938c({ position: position, setPosi
|
|
|
1050
1050
|
center: event.lngLat,
|
|
1051
1051
|
duration: 800
|
|
1052
1052
|
});
|
|
1053
|
-
},
|
|
1054
|
-
[
|
|
1053
|
+
}, [
|
|
1055
1054
|
mapRef.current,
|
|
1056
1055
|
setPosition
|
|
1057
1056
|
]);
|
package/dist/module.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"mappings":"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","sources":["packages/map-interface/src/index.ts","packages/map-interface/src/context-panel/index.ts","packages/map-interface/src/context-panel/main.module.sass","packages/map-interface/src/location-panel/index.ts","packages/map-interface/src/location-panel/header.ts","packages/map-interface/src/location-panel/main.module.sass","packages/map-interface/src/location-info/index.ts","packages/map-interface/src/location-info/utils.ts","packages/map-interface/src/location-info/hash-string.ts","packages/map-interface/src/dev/index.ts","packages/map-interface/src/dev/map-page.ts","packages/map-interface/src/dev/xray.ts","packages/map-interface/src/container.ts","packages/map-interface/src/main.module.sass","packages/map-interface/src/controls.ts","packages/map-interface/src/helpers.ts","packages/map-interface/src/utils.ts","packages/map-interface/src/map-view/index.ts","packages/map-interface/src/map-view/terrain.ts","packages/map-interface/src/dev/main.module.sass","packages/map-interface/src/dev/tile-extent.ts","packages/map-interface/src/dev/vector-tile-features.ts","packages/map-interface/src/expansion-panel/index.ts","packages/map-interface/src/expansion-panel/main.module.sass","packages/map-interface/src/expansion-panel/headers.ts"],"sourcesContent":["export * from \"./context-panel\";\nexport * from \"./location-panel\";\nexport * from \"./dev\";\nexport * from \"./container\";\nexport * from \"./map-view\";\nexport * from \"./controls\";\nexport * from \"./helpers\";\nexport * from \"./utils\";\nexport * from \"./location-info\";\nexport * from \"./expansion-panel\";\n","import { useMemo } from \"react\";\nimport { Navbar, Button, InputGroup, Spinner, Card } from \"@blueprintjs/core\";\nimport hyper from \"@macrostrat/hyper\";\nimport styles from \"./main.module.sass\";\nimport { useMapStatus } from \"@macrostrat/mapbox-react\";\n\nconst h = hyper.styled(styles);\n\nconst spinnerElement = h(Spinner, { size: 16 });\n\nexport function LoadingButton({\n isLoading = false,\n onClick,\n active = false,\n icon = \"menu\",\n}) {\n return h(Button, {\n className: \"loading-button\",\n icon: isLoading ? spinnerElement : icon,\n large: false,\n minimal: true,\n onClick,\n active: active && !isLoading,\n });\n}\n\nexport function MapLoadingButton(props) {\n const { isLoading } = useMapStatus();\n const mapIsLoading = useMemo(() => isLoading, [isLoading]);\n return h(LoadingButton, { ...props, isLoading: mapIsLoading });\n}\n\ntype AnyChildren = React.ReactNode | React.ReactFragment;\n\nexport function FloatingNavbar({\n className,\n children,\n statusElement = null,\n}: {\n className?: string;\n children?: AnyChildren;\n statusElement?: AnyChildren;\n}) {\n return h(\"div.searchbar-holder\", { className }, [\n h(\"div.navbar-holder\", [\n h(Navbar, { className: \"searchbar panel\" }, children),\n ]),\n h.if(statusElement != null)(\n Card,\n { className: \"status-tongue\" },\n statusElement\n ),\n ]);\n}\n",".searchbar-holder\n transition: margin 300ms\n display: flex\n flex-direction: column\n margin: 0\n .navbar-holder\n display: flex\n flex-direction: row\n .searchbar\n width: 100%\n background-color: var(--panel-background-color)\n border-radius: 5px\n padding: 0 5px\n display: flex\n flex-direction: row\n align-items: center\n gap: 5px\n :global(.bp5-input-group)\n flex-grow: 1\n cursor: text\n\n:global(.bp5-navbar)>.loading-button\n width: 40px\n height: 40px\n\n.status-tongue\n background-color: var(--panel-background-color)\n margin: 5px\n margin-top: -12px\n padding: 0\n padding-top: 12px\n\n@media screen and (max-width: 768px)\n .status-tongue\n max-width: 100vw\n margin: 0\n border-radius: 0\n margin-top: -3px\n","import { Card } from \"@blueprintjs/core\";\nimport hyper from \"@macrostrat/hyper\";\nimport { InfoDrawerHeader, InfoDrawerHeaderProps } from \"./header\";\nimport classNames from \"classnames\";\nimport styles from \"./main.module.sass\";\nimport { ErrorBoundary } from \"@macrostrat/ui-components\";\n\nconst h = hyper.styled(styles);\n\nexport function InfoDrawerContainer(props) {\n const className = classNames(\"infodrawer\", props.className);\n return h(Card, { ...props, className });\n}\n\ninterface BaseInfoDrawerProps extends InfoDrawerHeaderProps {\n className?: string;\n title?: string;\n headerElement?: JSX.Element;\n children?: React.ReactNode;\n}\n\nexport function BaseInfoDrawer(props: BaseInfoDrawerProps) {\n const {\n className,\n headerElement = null,\n title,\n onClose,\n children,\n ...rest\n } = props;\n const header =\n headerElement ??\n h(InfoDrawerHeader, { onClose, ...rest }, [\n title == null ? null : h(\"h3\", [title]),\n ]);\n return h(InfoDrawerContainer, { className }, [\n header,\n h(\n \"div.infodrawer-body\",\n h(\"div.infodrawer-contents\", h(ErrorBoundary, null, children))\n ),\n ]);\n}\n\nexport function LocationPanel(props) {\n const { children, className, loading = false, ...rest } = props;\n const cls = classNames(\"location-panel\", className, { loading });\n return h(BaseInfoDrawer, { className: cls, ...rest }, children);\n}\n","import { Icon, Button } from \"@blueprintjs/core\";\nimport hyper from \"@macrostrat/hyper\";\nimport styles from \"./main.module.sass\";\nimport { useToaster } from \"@macrostrat/ui-components\";\nimport { LngLatCoords, Elevation } from \"../location-info\";\nimport {\n LocationFocusButton,\n useFocusState,\n isCentered,\n} from \"@macrostrat/mapbox-react\";\n\nconst h = hyper.styled(styles);\n\nfunction PositionButton({ position, showCopyLink = false }) {\n const focusState = useFocusState(position);\n\n const copyLinkIsVisible = isCentered(focusState) && showCopyLink;\n\n return h(\"div.position-controls\", [\n h(LocationFocusButton, { location: position, focusState }, []),\n h.if(copyLinkIsVisible)(CopyLinkButton, { itemName: \"position\" }),\n ]);\n}\n\nfunction CopyLinkButton({ itemName, children, onClick, ...rest }) {\n const toaster = useToaster();\n\n let message = `Copied link`;\n if (itemName != null) {\n message += ` to ${itemName}`;\n }\n message += \"!\";\n\n return h(\n Button,\n {\n className: \"copy-link-button\",\n rightIcon: h(Icon, { icon: \"link\", size: 12 }),\n minimal: true,\n small: true,\n onClick() {\n navigator.clipboard.writeText(window.location.href).then(\n () => {\n toaster?.show({\n message,\n intent: \"success\",\n icon: \"clipboard\",\n timeout: 1000,\n });\n onClick?.();\n },\n () => {\n toaster?.show({\n message: \"Failed to copy link\",\n intent: \"danger\",\n icon: \"error\",\n timeout: 1000,\n });\n }\n );\n },\n ...rest,\n },\n children ?? \"Copy link\"\n );\n}\n\nexport interface InfoDrawerHeaderProps {\n onClose: () => void;\n position: mapboxgl.LngLat;\n zoom?: number;\n elevation?: number;\n showCopyPositionButton?: boolean;\n}\n\nexport function InfoDrawerHeader(props: InfoDrawerHeaderProps) {\n const {\n onClose,\n position,\n zoom = 7,\n elevation,\n showCopyPositionButton,\n } = props;\n\n return h(\"header.location-panel-header\", [\n h(PositionButton, { position, showCopyLink: showCopyPositionButton }),\n h(\"div.spacer\"),\n h(LngLatCoords, {\n position,\n zoom,\n className: \"infodrawer-header-item\",\n }),\n h.if(elevation != null)(Elevation, {\n elevation,\n className: \"infodrawer-header-item\",\n }),\n h(Button, { minimal: true, icon: \"cross\", onClick: onClose }),\n ]);\n}\n",".copy-link-button:global(.bp5-minimal.bp5-button)\n color: var(--text-subtle-color)\n\n svg\n fill: var(--text-subtle-color)\n\n.location-panel-header\n padding: 5px\n display: flex\n flex-direction: row\n align-items: center\n gap: 1em\n border-bottom: 1px solid var(--panel-rule-color)\n\n .spacer\n flex-grow: 1\n\n .left-icon\n padding: 7px\n\n .position-controls :global(.bp5-button)\n font-size: 12px !important\n\n.infodrawer-header-item\n font-size: 12px\n\n :global(.secondary)\n font-size: 0.9em\n color: var(--text-subtle-color)\n\n.infodrawer\n pointer-events: all\n max-height: 100%\n max-width: 100%\n height: fit-content\n display: flex\n flex-direction: column\n overflow: hidden\n background-color: var(--panel-background-color)\n\n &:global(.bp5-card)\n padding: 0\n background-color: var(--panel-background-color)\n\n\n &.loading\n .infodrawer-body\n overflow-y: hidden\n min-height: 70px\n\n\n.infodrawer-contents\n padding: 0 1em 1em\n\n.infodrawer-body\n flex-shrink: 1\n min-height: 0\n transition: min-height 0.5s ease\n overflow-y: scroll\n position: relative\n\n// TODO: remove this when we have a better way to handle card media queries\n@media screen and (max-width: 768px)\n .infodrawer\n border-radius: var(--panel-border-radius, 0px)\n","import h from \"@macrostrat/hyper\";\nimport {\n formatCoordForZoomLevel,\n metersToFeet,\n normalizeLng,\n} from \"@macrostrat/mapbox-utils\";\nimport { formatValue } from \"./utils\";\n\nexport * from \"./hash-string\";\n\nexport function ValueWithUnit(props) {\n const { value, unit } = props;\n return h(\"span.value-with-unit\", [\n h(\"span.value\", [value]),\n h(\"span.spacer\", [\" \"]),\n h(\"span.unit\", [unit]),\n ]);\n}\n\nexport function DegreeCoord(props) {\n const { value, labels, precision = 3, format = formatValue } = props;\n const direction = value < 0 ? labels[1] : labels[0];\n\n return h(ValueWithUnit, {\n value: format(Math.abs(value), precision) + \"°\",\n unit: direction,\n });\n}\n\nexport interface LngLatProps {\n /** Map position */\n position: [number, number] | { lat: number; lng: number };\n className?: string;\n /** Zoom level (used to infer coordinate rounding if provided) */\n zoom?: number | null;\n /** Number of decimal places to round coordinates to */\n precision: number | null;\n /** Function to format coordinates */\n format?: (val: number, precision: number) => string;\n}\n\nexport function LngLatCoords(props: LngLatProps) {\n /** Formatted geographic coordinates */\n const { position, className, precision, zoom } = props;\n let { format } = props;\n if (position == null) {\n return null;\n }\n let lat, lng;\n if (Array.isArray(position)) {\n [lng, lat] = position;\n } else {\n ({ lat, lng } = position);\n }\n\n if (zoom != null && format == null && precision == null) {\n format = (val, _) => formatCoordForZoomLevel(val, zoom);\n }\n\n return h(\"div.lnglat-container\", { className }, [\n h(\"span.lnglat\", [\n h(DegreeCoord, {\n value: lat,\n labels: [\"N\", \"S\"],\n precision,\n format,\n }),\n \", \",\n h(DegreeCoord, {\n value: normalizeLng(lng),\n labels: [\"E\", \"W\"],\n precision,\n format,\n }),\n ]),\n ]);\n}\n\nexport function Elevation(props) {\n /** Renders an elevation value in meters and a parenthetical conversion to feet. */\n const { elevation, className, includeFeet = true } = props;\n if (elevation == null) return null;\n return h(\"div.elevation\", { className }, [\n h(ValueWithUnit, { value: elevation, unit: \"m\" }),\n h.if(includeFeet)(\"span.secondary\", [\n \" (\",\n h(ValueWithUnit, { value: metersToFeet(elevation), unit: \"ft\" }),\n \")\",\n ]),\n ]);\n}\n","import { format } from \"d3-format\";\n\nexport const fmt4 = format(\".4~f\");\nexport const fmt3 = format(\".3~f\");\nexport const fmt2 = format(\".2~f\");\nexport const fmt1 = format(\".1~f\");\nexport const fmtInt = format(\".0f\");\n\nexport function formatValue(val: number, precision: number = 0): string {\n switch (precision) {\n case 4:\n return fmt4(val);\n case 3:\n return fmt3(val);\n case 2:\n return fmt2(val);\n case 1:\n return fmt1(val);\n case 0:\n return fmtInt(val);\n default:\n return fmt4(val);\n }\n}\n","import {\n LatLng,\n MapPosition,\n formatCoordForZoomLevel,\n} from \"@macrostrat/mapbox-utils\";\nimport { ParsedQuery } from \"query-string\";\nimport { fmt1, fmt2, fmtInt } from \"./utils\";\n\ninterface LocationHashParams {\n x?: string;\n y?: string;\n z?: string;\n a?: string;\n e?: string;\n}\n\nexport function applyMapPositionToHash(\n args: LocationHashParams,\n mapPosition: MapPosition | null\n) {\n const pos = mapPosition?.camera;\n if (pos == null) return;\n const zoom = mapPosition.target?.zoom;\n\n args.x = formatCoordForZoomLevel(pos.lng, zoom);\n args.y = formatCoordForZoomLevel(pos.lat, zoom);\n\n if (pos.bearing == 0 && pos.pitch == 0 && zoom != null) {\n args.z = fmt1(zoom);\n } else if (pos.altitude != null) {\n if (pos.altitude > 5000) {\n args.z = fmt2(pos.altitude / 1000) + \"km\";\n } else {\n args.z = fmtInt(pos.altitude) + \"m\";\n }\n }\n if (pos.bearing != 0) {\n let az = pos.bearing;\n if (az < 0) az += 360;\n args.a = fmtInt(az);\n }\n if (pos.pitch != 0) {\n args.e = fmtInt(pos.pitch);\n }\n}\n\nfunction _fmt(x: string | number | string[]) {\n if (Array.isArray(x)) {\n x = x[0];\n }\n return parseFloat(x.toString());\n}\n\nexport function getMapPositionForHash(\n hashData: ParsedQuery<string>,\n centerPosition: LatLng | null\n): MapPosition {\n const {\n x = centerPosition?.lng ?? 0,\n y = centerPosition?.lat ?? 0,\n // Different default for zoom depending on whether we have a marker\n z = centerPosition != null ? 7 : 2,\n a = 0,\n e = 0,\n } = hashData;\n\n const lng = _fmt(x);\n const lat = _fmt(y);\n\n let altitude = null;\n let zoom = null;\n const _z = z.toString();\n if (_z.endsWith(\"km\")) {\n altitude = _fmt(_z.substring(0, _z.length - 2)) * 1000;\n } else if (_z.endsWith(\"m\")) {\n altitude = _fmt(_z.substring(0, _z.length - 1));\n } else {\n zoom = _fmt(z);\n }\n const bearing = _fmt(a);\n const pitch = _fmt(e);\n\n let target = undefined;\n if (bearing == 0 && pitch == 0 && zoom != null) {\n target = {\n lat,\n lng,\n zoom,\n };\n }\n\n return {\n camera: {\n lng: _fmt(x),\n lat: _fmt(y),\n altitude,\n bearing: _fmt(a),\n pitch: _fmt(e),\n },\n target,\n };\n}\n","export * from \"./map-page\";\nexport * from \"./tile-extent\";\nexport * from \"./vector-tile-features\";\nexport * from \"./xray\";\n","// Import other components\nimport { Switch } from \"@blueprintjs/core\";\nimport hyper from \"@macrostrat/hyper\";\nimport { Spacer, useDarkMode, useStoredState } from \"@macrostrat/ui-components\";\nimport mapboxgl from \"mapbox-gl\";\nimport { useCallback, useState, useEffect } from \"react\";\nimport { buildInspectorStyle, buildXRayStyle } from \"./xray\";\nimport { MapAreaContainer, PanelCard } from \"../container\";\nimport { FloatingNavbar, MapLoadingButton } from \"../context-panel\";\nimport { MapMarker } from \"../helpers\";\nimport { LocationPanel } from \"../location-panel\";\nimport { MapView } from \"../map-view\";\nimport styles from \"./main.module.sass\";\nimport { TileExtentLayer } from \"./tile-extent\";\nimport {\n FeaturePanel,\n FeatureSelectionHandler,\n TileInfo,\n} from \"./vector-tile-features\";\nimport { MapPosition } from \"@macrostrat/mapbox-utils\";\n\nexport const h = hyper.styled(styles);\n\nexport function MapInspector({\n title = \"Map inspector\",\n headerElement = null,\n transformRequest = null,\n mapPosition = null,\n mapboxToken = null,\n overlayStyle = null,\n children,\n style,\n focusedSource = null,\n focusedSourceTitle = null,\n fitViewport = true,\n projection = null,\n}: {\n headerElement?: React.ReactElement;\n transformRequest?: mapboxgl.TransformRequestFunction;\n title?: string;\n style?: mapboxgl.Style | string;\n children?: React.ReactNode;\n mapboxToken?: string;\n overlayStyle?: mapboxgl.Style | string;\n focusedSource?: string;\n focusedSourceTitle?: string;\n projection?: string;\n mapPosition?: MapPosition;\n fitViewport?: boolean;\n}) {\n /* We apply a custom style to the panel container when we are interacting\n with the search bar, so that we can block map interactions until search\n bar focus is lost.\n We also apply a custom style when the infodrawer is open so we can hide\n the search bar on mobile platforms\n */\n\n const dark = useDarkMode();\n const isEnabled = dark?.isEnabled;\n\n if (mapboxToken != null) {\n mapboxgl.accessToken = mapboxToken;\n }\n\n style ??= isEnabled\n ? \"mapbox://styles/mapbox/dark-v10\"\n : \"mapbox://styles/mapbox/light-v10\";\n\n const [isOpen, setOpen] = useState(false);\n\n const [state, setState] = useStoredState(\"macrostrat:dev-map-page\", {\n showTileExtent: false,\n xRay: false,\n });\n const { showTileExtent, xRay } = state;\n\n const [actualStyle, setActualStyle] = useState(style);\n\n useEffect(() => {\n buildInspectorStyle(style, overlayStyle, {\n mapboxToken,\n inDarkMode: isEnabled,\n xRay,\n }).then(setActualStyle);\n }, [style, xRay, mapboxToken, isEnabled, overlayStyle]);\n\n const [inspectPosition, setInspectPosition] =\n useState<mapboxgl.LngLat | null>(null);\n\n const [data, setData] = useState(null);\n\n const onSelectPosition = useCallback((position: mapboxgl.LngLat) => {\n setInspectPosition(position);\n }, []);\n\n let detailElement = null;\n if (inspectPosition != null) {\n detailElement = h(\n LocationPanel,\n {\n onClose() {\n setInspectPosition(null);\n },\n position: inspectPosition,\n },\n [\n h(TileInfo, {\n feature: data?.[0] ?? null,\n showExtent: showTileExtent,\n setShowExtent() {\n setState({ ...state, showTileExtent: !showTileExtent });\n },\n }),\n h(FeaturePanel, { features: data, focusedSource, focusedSourceTitle }),\n ]\n );\n }\n\n let tile = null;\n if (showTileExtent && data?.[0] != null) {\n let f = data[0];\n tile = { x: f._x, y: f._y, z: f._z };\n }\n\n return h(\n MapAreaContainer,\n {\n navbar: h(FloatingNavbar, [\n headerElement ?? h(\"h2\", title),\n h(Spacer),\n h(MapLoadingButton, {\n active: isOpen,\n onClick: () => setOpen(!isOpen),\n }),\n ]),\n contextPanel: h(PanelCard, [\n h(Switch, {\n checked: xRay,\n label: \"X-ray mode\",\n onChange() {\n setState({ ...state, xRay: !xRay });\n },\n }),\n children,\n ]),\n detailPanel: detailElement,\n contextPanelOpen: isOpen,\n fitViewport,\n },\n h(\n MapView,\n {\n style: actualStyle,\n transformRequest,\n mapPosition,\n projection: { name: \"globe\" },\n mapboxToken,\n },\n [\n h(FeatureSelectionHandler, {\n selectedLocation: inspectPosition,\n setFeatures: setData,\n }),\n h(MapMarker, {\n position: inspectPosition,\n setPosition: onSelectPosition,\n }),\n h(TileExtentLayer, { tile, color: isEnabled ? \"white\" : \"black\" }),\n ]\n )\n );\n}\n\n// Legacy export\nexport const DevMapPage = MapInspector;\n","import { getMapboxStyle, mergeStyles } from \"@macrostrat/mapbox-utils\";\nimport chroma from \"chroma-js\";\nimport mapboxgl from \"mapbox-gl\";\n\ninterface XRayOptions {\n color?: string;\n inDarkMode?: boolean;\n mapboxToken?: string;\n xRaySources?: string[];\n}\n\nexport async function buildXRayStyle(\n baseStyle: string | object,\n params: XRayOptions = null\n) {\n const {\n inDarkMode = false,\n color = \"rgb(74, 242, 161)\",\n mapboxToken,\n xRaySources\n } = params;\n const style = await getMapboxStyle(baseStyle, { access_token: mapboxToken });\n const sources = xRaySources ?? Object.keys(style.sources);\n\n let layers = [];\n for (let layer of style.layers) {\n if (!sources.includes(layer.source)) {\n layers.push(layer);\n continue;\n }\n let newLayer = transformMapboxLayer(layer, color, inDarkMode);\n if (newLayer != null) {\n layers.push(newLayer);\n }\n }\n\n return {\n ...style,\n layers,\n };\n}\n\nfunction transformMapboxLayer(layer, color, inDarkMode) {\n const c = chroma(color);\n const xRayColor = (opacity = 1, darken = 0) => {\n if (!inDarkMode) {\n return chroma(color)\n .darken(2 - darken)\n .alpha(opacity)\n .css();\n }\n return c.alpha(opacity).darken(darken).css();\n };\n\n if (layer.type == \"background\") {\n return null;\n }\n\n let newLayer = { ...layer };\n\n if (layer.type == \"fill\") {\n newLayer.paint = {\n \"fill-color\": xRayColor(0.1),\n \"fill-outline-color\": xRayColor(0.5),\n };\n } else if (layer.type == \"line\") {\n newLayer.paint = {\n \"line-color\": xRayColor(0.5, 0),\n \"line-width\": 1.5,\n };\n } else if (layer.type == \"symbol\") {\n newLayer.paint = {\n \"text-color\": xRayColor(1, -0.5),\n \"text-halo-color\": \"#000\",\n };\n } else if (layer.type == \"circle\") {\n newLayer.paint = {\n \"circle-color\": xRayColor(0.5, 0),\n \"circle-stroke-color\": xRayColor(0.5, 1),\n \"circle-radius\": 2,\n };\n }\n\n return newLayer;\n}\n\ntype InspectorStyleOptions = XRayOptions & {\n xRay?: boolean;\n};\n\nexport async function buildInspectorStyle(\n baseStyle: mapboxgl.Style | string,\n overlayStyle: mapboxgl.Style | string | null = null,\n params: InspectorStyleOptions = {}\n) {\n const { mapboxToken, xRay = false, xRaySources: _xRaySources, ...rest } = params;\n let xRaySources = _xRaySources;\n let style = await getMapboxStyle(baseStyle, {\n access_token: mapboxToken,\n });\n\n if (overlayStyle != null) {\n const overlay = await getMapboxStyle(overlayStyle, {\n access_token: mapboxToken,\n });\n style = mergeStyles(style, overlay);\n xRaySources ??= Object.keys(overlay.sources);\n }\n\n\n if (xRay) {\n // If we haven't specified sources, then we'll use all of them\n xRaySources ??= Object.keys(style.sources);\n\n style = await buildXRayStyle(style, { ...rest, mapboxToken, xRaySources });\n }\n return style;\n}\n","import hyper, { addClassNames } from \"@macrostrat/hyper\";\nimport { HTMLDivProps } from \"@blueprintjs/core\";\nimport styles from \"./main.module.sass\";\nimport classNames from \"classnames\";\nimport { useTransition } from \"transition-hook\";\nimport {\n MapboxMapProvider,\n ZoomControl,\n useMapPosition,\n} from \"@macrostrat/mapbox-react\";\nimport { ToasterContext } from \"@macrostrat/ui-components\";\nimport { MapBottomControls } from \"./controls\";\nimport { mapViewInfo, MapPosition } from \"@macrostrat/mapbox-utils\";\nimport { Card } from \"@blueprintjs/core\";\n\nimport { ReactNode } from \"react\";\n\nconst h = hyper.styled(styles);\n\ntype AnyElement = React.ReactNode | React.ReactElement | React.ReactFragment;\n\nexport const PanelCard = (props) =>\n h(Card, { ...props, className: classNames(\"panel-card\", props.className) });\n\ninterface ContextStackProps extends HTMLDivProps {\n adaptiveWidth: boolean;\n navbar: AnyElement;\n}\n\nexport enum DetailPanelStyle {\n FIXED = \"fixed\",\n FLOATING = \"floating\",\n}\n\nfunction _MapAreaContainer({\n children,\n className,\n navbar,\n contextPanel = null,\n detailPanel = null,\n detailPanelOpen,\n contextPanelOpen = true,\n bottomPanel = null,\n mainPanel,\n mapControls = h(MapBottomControls),\n contextStackProps = null,\n detailStackProps = null,\n detailPanelStyle = DetailPanelStyle.FLOATING,\n fitViewport = true,\n showPanelOutlines = false,\n preventMapInteraction = false,\n ...rest\n}: {\n navbar: AnyElement;\n children?: AnyElement;\n mapControls?: AnyElement;\n contextPanel?: AnyElement;\n contextStack?: AnyElement;\n mainPanel?: AnyElement;\n detailPanel?: AnyElement;\n bottomPanel?: AnyElement;\n className?: string;\n detailPanelOpen?: boolean;\n contextPanelOpen?: boolean;\n contextStackProps?: ContextStackProps;\n detailStackProps?: HTMLDivProps;\n detailPanelStyle: DetailPanelStyle;\n fitViewport?: boolean;\n showPanelOutlines?: boolean;\n}) {\n const _detailPanelOpen = detailPanelOpen ?? detailPanel != null;\n const contextPanelTrans = useTransition(contextPanelOpen, 800);\n const detailPanelTrans = useTransition(_detailPanelOpen, 800);\n\n /*- We apply a custom style to the panel container when we are interacting\n with the search bar, so that we can block map interactions until search\n bar focus is lost.\n - We also apply a custom style when the infodrawer is open so we can hide\n the search bar on mobile platforms\n - These styles are doubly applied so we can have both namespaced and\n outside-accessible styles for each case.\n */\n const mainUIClassNames = classNames(\n \"map-container\",\n className,\n `detail-panel-${detailPanelStyle}`,\n `context-panel-${contextPanelTrans.stage}`,\n `map-context-${contextPanelTrans.stage}`,\n `detail-panel-${detailPanelTrans.stage}`,\n `map-detail-${detailPanelTrans.stage}`,\n {\n \"detail-panel-open\": _detailPanelOpen,\n \"map-context-open\": contextPanelOpen,\n \"show-panel-outlines\": showPanelOutlines,\n \"fit-viewport\": fitViewport,\n }\n );\n\n const mapControlsExt = h([\n h(ZoomControl, { className: \"zoom-control\" }),\n h(\"div.spacer\"),\n mapControls,\n ]);\n\n const detailStackExt = h(\n \"div.detail-stack.infodrawer-container\",\n detailStackProps,\n [\n h(\"div.detail-panel-holder\", null, detailPanel),\n h.if(detailPanelStyle == DetailPanelStyle.FLOATING)([mapControlsExt]),\n ]\n );\n\n return h(MapStyledContainer, { className: mainUIClassNames }, [\n h(\"div.main-row\", [\n h(\"div.map-ui\", { ...rest }, [\n h(ContextStack, { navbar, ...contextStackProps }, [\n h.if(contextPanelTrans.shouldMount)([contextPanel]),\n ]),\n //h(MapView),\n children ?? mainPanel,\n h.if(detailPanelStyle == DetailPanelStyle.FLOATING)([detailStackExt]),\n h.if(detailPanelStyle == DetailPanelStyle.FIXED)(\n \"div.map-control-stack\",\n mapControlsExt\n ),\n ]),\n h.if(detailPanelStyle == DetailPanelStyle.FIXED)([detailStackExt]),\n ]),\n h(\"div.bottom\", null, bottomPanel),\n ]);\n}\n\nfunction ContextStack(props: ContextStackProps) {\n const { adaptiveWidth, navbar, children, ...rest } = props;\n const props1 = addClassNames(rest, { \"adaptive-width\": adaptiveWidth });\n return h(\"div.context-stack\", props1, [\n navbar,\n h(\"div.context-panel-holder\", null, children),\n h(\"div.spacer\"),\n ]);\n}\n\nconst MapProviders = ({ children }) =>\n h(ToasterContext, h(MapboxMapProvider, children));\n\nexport const MapAreaContainer = (props) =>\n h(MapProviders, h(_MapAreaContainer, props));\n\ninterface MapContainerProps {\n className?: string;\n children?: ReactNode;\n}\n\nexport function MapStyledContainer({ className, children }: MapContainerProps) {\n const mapPosition = useMapPosition();\n if (mapPosition != null) {\n const { mapIsRotated, mapUse3D, mapIsGlobal } = mapViewInfo(mapPosition);\n className = classNames(className, {\n \"map-is-rotated\": mapIsRotated,\n \"map-3d-available\": mapUse3D,\n \"map-is-global\": mapIsGlobal,\n });\n }\n\n return h(\"div\", { className }, children);\n}\n\n//const _MapPage = compose(HotkeysProvider, MapPage);\n",".map-container\n display: flex\n flex-direction: column\n position: relative\n width: 100%\n height: 100%\n overflow: hidden\n\n &.show-panel-outlines\n .map-view-container\n outline: 2px dotted dodgerblue\n\n &.fit-viewport\n height: 100vh\n width: 100vw\n /* mobile viewport bug fix */\n max-height: -webkit-fill-available\n\n // Compass display\n .compass-control\n display: none\n\n &.map-is-rotated\n .compass-control\n display: block\n\n .map-3d-control\n display: none\n\n &.map-3d-available .map-3d-control\n display: block\n\n &.map-is-rotated.map-3d-available .map-3d-control\n display: none\n\n .globe-control\n display: none\n\n svg\n color: var(--secondary-color)\n\n &.map-is-global .globe-control\n display: block\n\n &.detail-panel-open\n .zoom-control\n opacity: 0\n display: none\n\n &.detail-panel-fixed\n .detail-panel-holder\n & > *\n border-radius: unset\n\n.detail-panel-holder\n display: flex\n flex-direction: column\n min-height: 0\n\n & > *\n flex: 1\n\n.map-control-stack\n display: flex\n flex-direction: column\n width: 30em\n margin-left: -30em\n pointer-events: none\n\n.main-row\n flex: 1\n display: flex\n flex-direction: row\n position: relative\n max-height: 100%\n min-height: 0\n\n.map-ui\n flex: 1\n position: relative\n display: flex\n flex-direction: column\n max-height: 100%\n height: 100%\n box-shadow: 0 0 10px 4px var(--card-shadow-color)\n\n.map-view-container\n flex-grow: 1\n position: relative\n overflow: hidden\n\n.mapbox-map\n position: absolute\n top: 0\n bottom: 0\n left: 0\n right: 0\n\n &:global(.mapboxgl-map)\n // override the default mapbox position: relative in all cases\n position: absolute\n\n\n.panel-card\n padding: 10px\n background-color: var(--panel-background-color)\n overflow: hidden\n\n & > :last-child\n margin-bottom: 0\n\n:global(.bp5-dark) .panel-card\n background-color: var(--panel-background-color)\n\n.context-stack\n & > div\n flex-shrink: 1\n\n & > .searchbar\n flex: 0\n\n.context-stack,\n.detail-stack\n z-index: 10\n max-height: 100%\n\n.panel-container\n display: flex\n flex-direction: column\n\n & > div\n pointer-events: all\n\n.panel-title\n font-size: 16px\n\n.spacer\n flex-grow: 1\n pointer-events: none\n\n.map-view-container\n flex-grow: 1\n position: relative\n overflow: hidden\n\n.searchbar-holder\n margin-bottom: 0.5em\n\n.right-panel\n width: 24em\n\n.buttons\n display: flex\n flex-direction: row\n flex: 1\n min-width: 0\n\n.tab-button\n flex-shrink: 1\n min-width: 40px\n overflow: hidden\n text-align: right\n\n & :global(.bp5-button-text)\n transition: all 0.2s\n transition-delay: 0.1s\n\n .menu-card.narrow-card .panel-header:not(.minimal) &:global(.bp5-active) ~ & :global(.bp5-button-text)\n width: 0\n opacity: 0\n margin-left: -7px\n\n .context-panel-leave .menu-card .panel-header & :global(.bp5-button-text)\n opacity: 0\n width: 0\n\n.narrow-card.narrow-enter .panel-header .buttons\n margin-right: -500px\n\n.panel-header.minimal .tab-button:not(:hover):not(:global(.bp5-active))\n padding-left: 0\n padding-right: 0\n min-width: 30px\n width: 30px\n\n.panel-header.minimal .tab-button:not(:hover) :global(.bp5-button-text)\n width: 0\n opacity: 0\n margin-left: -7px\n\n.menu-group\n margin-bottom: 0.5em\n margin-top: 0.2em\n\n.menu-card :global .bp5-text ul,\n.menu-card :global .text-panel ul\n padding-left: 1em\n\n.menu-content\n display: flex\n flex-direction: column\n margin-bottom: -8px\n\n & .bp5-button-group\n margin-bottom: 4px\n\n & hr\n width: 100%\n\n:global\n .mapbox-map\n .mapbox-compass, .mapbox-3d\n display: none\n\n .mapboxgl-ctrl.mapbox-3d.mapbox-control\n width: unset\n\n .mapboxgl-ctrl.mapbox-3d.mapbox-control button\n width: unset\n padding-inline: 4px\n\n .mapboxgl-canvas-container\n width: 100%\n height: 100%\n\n .mapboxgl-ctrl.mapboxgl-ctrl-attrib\n background-color: var(--translucent-panel-background-color) !important\n\n .mapboxgl-ctrl.mapboxgl-ctrl-attrib a\n color: var(--text-color)\n\n .mapboxgl-marker svg path\n fill: var(--panel-background-color) !important\n\n .mapboxgl-marker svg circle\n fill: var(--secondary-color) !important\n\n .mapbox-control.mapbox-zoom\n background: var(--translucent-panel-background-inner)\n\n .mapbox-control.mapbox-zoom svg\n fill: var(--text-color) !important\n\n .mapboxgl-ctrl-logo\n transform: scale(0.9) translate(-8px, 2px)\n\n .bp5-dark\n .mapboxgl-ctrl-group\n background-color: var(--panel-background-color)\n\n .mapboxgl-ctrl-logo\n filter: invert(100%)\n\n .mapboxgl-ctrl-group button + button\n border-top: 1px solid var(--panel-rule-color) !important\n\n .bp5-dark .mapboxgl-ctrl-group .mapboxgl-ctrl-icon\n filter: invert(40%)\n\n .bp5-dark .mapboxgl-ctrl-group .mapboxgl-ctrl-icon:hover\n filter: invert(50%)\n\n .mapboxgl-ctrl-geolocate .mapboxgl-ctrl-icon\n filter: invert(40%)\n\n .mapboxgl-ctrl-geolocate .mapboxgl-ctrl-icon:hover\n filter: invert(50%)\n\n.detail-stack\n position: relative\n\n.detail-panel-container, .map-right-controls\n flex: 1\n\n\n.zoom-control\n transition: opacity 1s ease-in-out\n width: 30px\n position: absolute\n top: 0\n right: 0\n\n.map-controls\n display: flex\n flex-direction: row\n justify-content: right\n margin-bottom: 0\n gap: 0.5em\n\n :global(.map-control)\n & > :global(.bp5-button)\n padding: 0\n transform: translate(-3.5px, -3.5px)\n width: 22px !important\n\n\n.map-controls :global(.mapbox-control),\n.map-controls :global(.map-control-wrapper),\n.map-controls :global(.map-control)\n max-height: 22px\n height: 22px\n border-radius: 4px\n background-color: var(--panel-background-color)\n box-shadow: 0 0 0 1px var(--card-shadow-color)\n\n.map-controls :global(.mapbox-control) button,\n.map-controls :global(.map-control-wrapper) button,\n.map-controls :global(.map-control) button\n max-height: 22px\n height: 22px\n width: 22px\n max-width: 22px\n background-position: center center\n padding: 0\n//background-color: var(--panel-background-color)\n//color: var(--text-color)\n\n//.map-controls :global(.mapbox-control) button:hover,\n//.map-controls :global(.map-control-wrapper) button:hover,\n//.map-controls .map-control button:hover\n// background-color: var(--panel-background-color) !important\n\n.map-controls .map-scale-control\n background: none\n box-shadow: none\n padding-top: 8px\n\n :global(.mapboxgl-ctrl-scale)\n background-color: var(--translucent-panel-background-color)\n border-color: var(--secondary-text-color)\n color: var(--secondary-text-color)\n\n// .map-container.detail-panel-fixed\n// right: 30em\n\n/* For mobile phones, we want to make the most of screen space,\n which in some cases means adding complications to the basic page. */\n@media only screen and (max-width: 768px)\n .map-container.detail-panel-enter .context-stack\n height: 0\n visibility: hidden\n transition: height 0.5s ease-in-out\n\n .detail-stack\n height: fit-content\n position: inherit\n max-height: 70%\n\n .infodrawer-stack\n max-height: 70%\n\n &:global(.exit-active)\n max-height: 0\n\n :global(.mapbox-control.mapbox-zoom)\n display: none\n\n .map-controls\n position: absolute\n top: -60px\n right: 10px\n\n .detail-panel\n border-radius: 0px\n\n\n/* Desktop styling is necessarily much more complicated than mobile\n to handle a two-column layout. */\n@media screen and (min-width: 768px)\n /* Make map fill page rather than containing div,\n by unsetting map position */\n // We should move this to another file.\n .map-view-container\n position: unset\n\n\n .map-ui\n flex-direction: row\n padding: 1em 1em 2em\n min-height: 80px\n gap: 0.5em\n\n .context-stack\n max-width: var(--map-context-stack-max-width, 34em)\n min-width: 14em\n transition: width 300ms ease\n padding-bottom: 0.5em\n width: var(--map-context-stack-width, 16em)\n margin-right: 0.5em\n display: flex\n flex-direction: column\n\n &.adaptive-width\n width: var(--map-context-stack-width, none)\n max-width: var(--map-context-stack-max-width, none)\n transition: width 300ms ease\n\n :global(.bp5-navbar)\n //height: unset\n //padding: 5px\n h1, h2, h3\n margin: 0\n\n & > .spacer\n flex-grow: 0\n\n .context-panel-holder\n min-height: 0\n position: relative\n\n & > div\n max-height: 100%\n\n .detail-stack\n width: var(--map-detail-stack-width, 30em)\n display: flex\n flex-direction: column\n\n .context-stack, .detail-stack\n pointer-events: none\n z-index: 10\n\n & > div\n pointer-events: all\n margin-bottom: 0.5em\n\n &:last-child\n margin-bottom: 0\n\n &.spacer\n pointer-events: none\n\n .context-stack .spacer\n min-height: 1em\n\n /* Make map fill page rather than containing div,\n by unsetting map position */\n .map-view-container\n position: unset\n\n/** CSS Transitions **/\n\n.map-container\n // Context panel\n .context-panel-holder\n pointer-events: none\n flex: 1\n\n & > div\n pointer-events: all\n transition: opacity 0.8s ease\n //, height 0.8s ease, max-height 0.8s ease, padding 0.8s ease\n\n &.context-panel-from .context-panel-holder > div\n opacity: 0\n\n &.context-panel-enter .context-panel-holder > div\n opacity: 1\n\n &.context-panel-leave .context-panel-holder > div\n opacity: 0\n\n // Detail panel (floating)\n &.detail-panel-floating\n // We assume that the relevant panel is the first child of the stack.\n &.detail-panel-from .detail-panel-holder\n opacity: 0\n\n &.detail-panel-enter .detail-panel-holder\n opacity: 1\n\n &.detail-panel-leave .detail-panel-holder\n opacity: 0\n\n .detail-panel\n transition: opacity 0.8s ease, height 0.8s ease, max-height 0.8s ease\n\n // TODO: these styles have not been evaluated for mobile\n &.detail-panel-fixed\n .map-ui\n transition: margin-right 0.8s ease\n\n .detail-stack\n transition: margin-right 0.8s ease\n\n &.detail-panel-from .detail-panel-holder\n margin-right: calc(-1 * var(--map-detail-stack-width, 30em))\n\n &.detail-panel-enter .detail-panel-holder\n margin-right: 0\n\n &.detail-panel-leave .detail-panel-holder\n margin-right: calc(-1 * var(--map-detail-stack-width, 30em))\n\n\n// The max-height transition is a bit jerky because of panel padding.\n// We could probably fix this by pulling the panel container itself into\n// the class.\n//max-height: 0\n//padding: 0i\n\n@media only screen and (max-width: 768px)\n .map-container .detail-stack\n transition: opacity 0.8s ease, height 0.8s ease, max-height 0.8s ease\n\n .map-container.detail-panel-from .detail-stack\n max-height: 0\n height: 0\n\n .map-container.detail-panel-leave .detail-stack\n max-height: 0\n\n .map-container.context-panel-from .context-panel\n max-height: 0\n height: 0\n\n .map-container.context-panel-leave\n .context-stack\n .context-panel-holder\n flex: 0\n\n .spacer\n flex: 1\n\n// Shift UI around to center elements if we're in the global view \n@media only screen and (min-width: 768px)\n .map-container.detail-panel-leave .map-view-container\n margin-right: -14em\n\n .map-container.map-is-global.detail-panel-leave .map-view-container\n margin-right: -30em\n\n .map-container.map-is-global.context-panel-leave .map-view-container\n margin-left: -16em\n","import { useRef } from \"react\";\nimport { GeolocateControl } from \"mapbox-gl\";\nimport hyper from \"@macrostrat/hyper\";\nimport styles from \"./main.module.sass\";\nimport {\n CompassControl,\n GlobeControl,\n ThreeDControl,\n MapControlWrapper,\n useMapStatus,\n} from \"@macrostrat/mapbox-react\";\nimport { ScaleControl as BaseScaleControl } from \"mapbox-gl\";\nimport { DevToolsButtonSlot } from \"@macrostrat/ui-components\";\n\nconst h = hyper.styled(styles);\n\nfunction ScaleControl(props) {\n const optionsRef = useRef({\n maxWidth: 200,\n unit: \"metric\",\n });\n return h(MapControlWrapper, {\n className: \"map-scale-control\",\n control: BaseScaleControl,\n options: optionsRef.current,\n ...props,\n });\n}\n\nfunction GeolocationControl(props) {\n const optionsRef = useRef({\n showAccuracyCircle: true,\n showUserLocation: true,\n trackUserLocation: true,\n positionOptions: {\n enableHighAccuracy: true,\n },\n });\n return h(MapControlWrapper, {\n control: GeolocateControl,\n options: optionsRef.current,\n ...props,\n });\n}\n\nexport function MapBottomControls({ children }) {\n const { isInitialized } = useMapStatus();\n\n if (!isInitialized) {\n return null;\n }\n\n return h(\"div.map-controls\", [\n h(ScaleControl),\n h(ThreeDControl, { className: \"map-3d-control\" }),\n h(CompassControl, { className: \"compass-control\" }),\n h(GlobeControl, { className: \"globe-control\" }),\n h(GeolocationControl, { className: \"geolocation-control\" }),\n // If we have global development tools enabled, show the button\n h(DevToolsButtonSlot, { className: \"map-control\" }),\n children,\n ]);\n}\n","import {\n useMapRef,\n useMapEaseTo,\n useMapDispatch,\n useMapStatus,\n} from \"@macrostrat/mapbox-react\";\nimport { useRef } from \"react\";\nimport { debounce } from \"underscore\";\nimport useResizeObserver from \"use-resize-observer\";\n\nimport { getMapPosition } from \"@macrostrat/mapbox-utils\";\nimport mapboxgl from \"mapbox-gl\";\nimport { useCallback, useEffect, useState } from \"react\";\nimport { getMapPadding, useMapMarker } from \"./utils\";\n\nexport function MapResizeManager({ containerRef }) {\n const mapRef = useMapRef();\n\n const debouncedResize = useRef(\n debounce(() => {\n mapRef.current?.resize();\n }, 100)\n );\n\n useResizeObserver({\n ref: containerRef,\n onResize: debouncedResize.current,\n });\n\n return null;\n}\n\ninterface MapPaddingManagerProps {\n containerRef: React.RefObject<HTMLDivElement>;\n parentRef: React.RefObject<HTMLDivElement>;\n infoMarkerPosition: mapboxgl.LngLatLike;\n}\n\nexport function MapPaddingManager({\n containerRef,\n parentRef,\n infoMarkerPosition,\n}: MapPaddingManagerProps) {\n const mapRef = useMapRef();\n\n const [padding, setPadding] = useState(\n getMapPadding(containerRef, parentRef)\n );\n\n const updateMapPadding = useCallback(() => {\n const newPadding = getMapPadding(containerRef, parentRef);\n setPadding(newPadding);\n }, [containerRef.current, parentRef.current]);\n\n useEffect(() => {\n const map = mapRef.current;\n if (map == null) return;\n // Update map padding on load\n updateMapPadding();\n }, [mapRef.current]);\n\n useResizeObserver({\n ref: parentRef,\n onResize(sz) {\n updateMapPadding();\n },\n });\n\n // Ideally, we would not have to do this when we know the infobox is loaded\n useMapEaseTo({ center: infoMarkerPosition, padding });\n\n return null;\n}\n\nexport function MapMovedReporter({ onMapMoved = null }) {\n const mapRef = useMapRef();\n const dispatch = useMapDispatch();\n\n const mapMovedCallback = useCallback(() => {\n const map = mapRef.current;\n if (map == null) return;\n const mapPosition = getMapPosition(map);\n dispatch({ type: \"map-moved\", payload: mapPosition });\n onMapMoved?.(mapPosition, map);\n }, [mapRef.current, onMapMoved, dispatch]);\n\n useEffect(() => {\n // Get the current value of the map. Useful for gradually moving away\n // from class component\n const map = mapRef.current;\n if (map == null) return;\n // Update the URI when the map moves\n mapMovedCallback();\n const cb = debounce(mapMovedCallback, 100);\n map.on(\"moveend\", cb);\n return () => {\n map?.off(\"moveend\", cb);\n };\n }, [mapMovedCallback]);\n return null;\n}\n\nexport function MapLoadingReporter({\n ignoredSources,\n onMapLoading = null,\n onMapIdle = null,\n mapIsLoading,\n}) {\n const mapRef = useMapRef();\n const loadingRef = useRef(false);\n const dispatch = useMapDispatch();\n\n useEffect(() => {\n const map = mapRef.current;\n const mapIsLoading = loadingRef.current;\n if (map == null) return;\n\n let didSendLoading = false;\n\n const loadingCallback = (evt) => {\n if (ignoredSources.includes(evt.sourceId) || mapIsLoading) return;\n if (didSendLoading) return;\n onMapLoading?.(evt);\n dispatch({ type: \"set-loading\", payload: true });\n loadingRef.current = true;\n didSendLoading = true;\n };\n const idleCallback = (evt) => {\n if (!mapIsLoading) return;\n dispatch({ type: \"set-loading\", payload: false });\n loadingRef.current = false;\n onMapIdle?.(evt);\n };\n map.on(\"sourcedataloading\", loadingCallback);\n map.on(\"idle\", idleCallback);\n return () => {\n map?.off(\"sourcedataloading\", loadingCallback);\n map?.off(\"idle\", idleCallback);\n };\n }, [ignoredSources, mapRef.current, mapIsLoading]);\n return null;\n}\n\nexport function MapMarker({ position, setPosition, centerMarker = true }) {\n const mapRef = useMapRef();\n const markerRef = useRef(null);\n\n useMapMarker(mapRef, markerRef, position);\n\n const handleMapClick = useCallback(\n (event: mapboxgl.MapMouseEvent) => {\n setPosition(event.lngLat, event, mapRef.current);\n // We should integrate this with the \"easeToCenter\" hook\n if (centerMarker) {\n mapRef.current?.flyTo({ center: event.lngLat, duration: 800 });\n }\n }, // eslint-disable-next-line react-hooks/exhaustive-deps\n [mapRef.current, setPosition]\n );\n\n useEffect(() => {\n const map = mapRef.current;\n if (map != null && setPosition != null) {\n map.on(\"click\", handleMapClick);\n }\n return () => {\n map?.off(\"click\", handleMapClick);\n };\n }, [mapRef.current, setPosition]);\n\n return null;\n}\n","import { useEffect } from \"react\";\nimport { Marker } from \"mapbox-gl\";\n\nfunction calcMapPadding(rect, childRect) {\n return {\n left: Math.max(rect.left - childRect.left, 0),\n top: Math.max(rect.top - childRect.top, 0),\n right: Math.max(childRect.right - rect.right, 0),\n bottom: Math.max(childRect.bottom - rect.bottom, 0),\n };\n}\n\nexport function getMapPadding(ref, parentRef) {\n const rect = parentRef.current?.getBoundingClientRect();\n const childRect = ref.current?.getBoundingClientRect();\n if (rect == null || childRect == null) return;\n return calcMapPadding(rect, childRect);\n}\n\nexport function useMapMarker(mapRef, markerRef, markerPosition) {\n useEffect(() => {\n const map = mapRef.current;\n if (map == null) return;\n if (markerPosition == null) {\n markerRef.current?.remove();\n return;\n }\n const marker = markerRef.current ?? new Marker();\n marker.setLngLat(markerPosition).addTo(map);\n markerRef.current = marker;\n return () => marker.remove();\n }, [mapRef.current, markerPosition]);\n}\n","import hyper from \"@macrostrat/hyper\";\nimport {\n useMapRef,\n useMapDispatch,\n useMapPosition,\n} from \"@macrostrat/mapbox-react\";\nimport {\n mapViewInfo,\n MapPosition,\n setMapPosition,\n} from \"@macrostrat/mapbox-utils\";\nimport classNames from \"classnames\";\nimport mapboxgl from \"mapbox-gl\";\nimport { useEffect, useRef, useCallback } from \"react\";\nimport styles from \"../main.module.sass\";\nimport { enable3DTerrain } from \"./terrain\";\nimport {\n MapLoadingReporter,\n MapMovedReporter,\n MapPaddingManager,\n MapResizeManager,\n} from \"../helpers\";\nimport \"mapbox-gl/dist/mapbox-gl.css\";\nimport { getMapPadding } from \"../utils\";\n\nconst h = hyper.styled(styles);\n\ntype MapboxCoreOptions = Omit<mapboxgl.MapboxOptions, \"container\">;\n\nexport interface MapViewProps extends MapboxCoreOptions {\n showLineSymbols?: boolean;\n children?: React.ReactNode;\n mapboxToken?: string;\n // Deprecated\n accessToken?: string;\n terrainSourceID?: string;\n enableTerrain?: boolean;\n infoMarkerPosition?: mapboxgl.LngLatLike;\n mapPosition?: MapPosition;\n initializeMap?: (\n container: HTMLElement,\n args: MapboxOptionsExt\n ) => mapboxgl.Map;\n onMapLoaded?: (map: mapboxgl.Map) => void;\n onStyleLoaded?: (map: mapboxgl.Map) => void;\n onMapMoved?: (mapPosition: MapPosition, map: mapboxgl.Map) => void;\n}\n\nexport interface MapboxOptionsExt extends MapboxCoreOptions {\n mapPosition?: MapPosition;\n}\n\nfunction defaultInitializeMap(container, args: MapboxOptionsExt = {}) {\n const { mapPosition, ...rest } = args;\n console.log(\"Initializing map (default)\", args);\n\n const map = new mapboxgl.Map({\n container,\n maxZoom: 18,\n //maxTileCacheSize: 0,\n logoPosition: \"bottom-left\",\n trackResize: true,\n antialias: true,\n optimizeForTerrain: true,\n ...rest,\n });\n\n // set initial map position\n if (mapPosition != null) {\n setMapPosition(map, mapPosition);\n }\n\n //setMapPosition(map, mapPosition);\n return map;\n}\n\nconst defaultMapPosition: MapPosition = {\n camera: {\n lat: 34,\n lng: -120,\n altitude: 300000,\n },\n};\n\nexport function MapView(props: MapViewProps) {\n let { terrainSourceID } = props;\n const {\n enableTerrain = true,\n style,\n mapPosition = defaultMapPosition,\n initializeMap = defaultInitializeMap,\n children,\n mapboxToken,\n // Deprecated\n accessToken,\n infoMarkerPosition,\n transformRequest,\n projection,\n onMapLoaded = null,\n onStyleLoaded = null,\n onMapMoved = null,\n ...rest\n } = props;\n if (enableTerrain) {\n terrainSourceID ??= \"mapbox-3d-dem\";\n }\n\n const _mapboxToken = mapboxToken ?? accessToken;\n\n if (_mapboxToken != null) {\n mapboxgl.accessToken = _mapboxToken;\n }\n\n const dispatch = useMapDispatch();\n let mapRef = useMapRef();\n const ref = useRef<HTMLDivElement>();\n const parentRef = useRef<HTMLDivElement>();\n\n // Keep track of map position for reloads\n useEffect(() => {\n console.log(\"Map updated\", mapRef.current);\n }, [mapRef.current]);\n\n useEffect(() => {\n if (style == null) return;\n if (mapRef.current != null) {\n console.log(\"Setting style\", style);\n mapRef.current.setStyle(style);\n return;\n }\n const map = initializeMap(ref.current, {\n style,\n projection,\n mapPosition,\n ...rest,\n });\n map.setPadding(getMapPadding(ref, parentRef), { animate: false });\n map.on(\"style.load\", () => {\n onStyleLoaded?.(map);\n dispatch({ type: \"set-style-loaded\", payload: true });\n });\n onMapLoaded?.(map);\n dispatch({ type: \"set-map\", payload: map });\n }, [style]);\n\n // Map style updating\n // useEffect(() => {\n // if (mapRef?.current == null || style == null) return;\n // mapRef?.current?.setStyle(style);\n // }, [mapRef.current, style]);\n\n // Set map position if it changes\n // useEffect(() => {\n // const map = mapRef.current;\n // if (map == null || mapPosition == null) return;\n // setMapPosition(map, mapPosition);\n // }, [mapPosition]);\n\n const _computedMapPosition = useMapPosition();\n const { mapUse3D, mapIsRotated } = mapViewInfo(_computedMapPosition);\n\n // Get map projection\n const _projection = mapRef.current?.getProjection()?.name ?? \"mercator\";\n\n const className = classNames(\n {\n \"is-rotated\": mapIsRotated ?? false,\n \"is-3d-available\": mapUse3D ?? false,\n },\n `${_projection}-projection`\n );\n\n return h(\"div.map-view-container.main-view\", { ref: parentRef }, [\n h(\"div.mapbox-map#map\", { ref, className }),\n h(MapLoadingReporter, {\n ignoredSources: [\"elevationMarker\", \"crossSectionEndpoints\"],\n }),\n h(MapMovedReporter, { onMapMoved }),\n h(MapResizeManager, { containerRef: ref }),\n h(MapPaddingManager, { containerRef: ref, parentRef, infoMarkerPosition }),\n h(MapTerrainManager, { mapUse3D, terrainSourceID }),\n children,\n ]);\n}\n\nexport function MapTerrainManager({\n mapUse3D,\n terrainSourceID,\n}: {\n mapUse3D?: boolean;\n terrainSourceID?: string;\n}) {\n const mapRef = useMapRef();\n\n useEffect(() => {\n const map = mapRef.current;\n if (map == null) return;\n enable3DTerrain(map, mapUse3D, terrainSourceID);\n }, [mapRef.current, mapUse3D]);\n return null;\n}\n","// We should merge this with code in @macrostrat/mapbox-react/src/terrain.ts:\n\nexport function enable3DTerrain(\n map,\n shouldEnable: boolean,\n sourceID: string | null = null\n) {\n if (!map.style?._loaded) {\n map.once(\"style.load\", () => {\n enable3DTerrain(map, shouldEnable, sourceID);\n });\n return;\n }\n\n const currentTerrainSource = getTerrainSourceID(map);\n let demSourceID = sourceID ?? currentTerrainSource ?? \"mapbox-dem\";\n\n console.log(\"Enabling 3D terrain with source\", demSourceID);\n\n // Enable or disable terrain depending on our current desires...\n const currentTerrain = map.getTerrain();\n\n if (!shouldEnable) {\n if (currentTerrain != null) map.setTerrain(null);\n return;\n }\n if (currentTerrain != null) return;\n\n // Add a DEM source if one is not found already.\n if (map.getSource(demSourceID) == null) {\n map.addSource(demSourceID, {\n type: \"raster-dem\",\n url: \"mapbox://mapbox.mapbox-terrain-dem-v1\",\n tileSize: 512,\n maxzoom: 14,\n });\n }\n\n // add a sky layer that will show when the map is highly pitched\n if (map.getLayer(\"sky\") == null) {\n map.addLayer({\n id: \"sky\",\n type: \"sky\",\n paint: {\n \"sky-type\": \"atmosphere\",\n \"sky-atmosphere-sun\": [0.0, 0.0],\n \"sky-atmosphere-sun-intensity\": 15,\n },\n });\n }\n\n map.setTerrain({ source: demSourceID, exaggeration: 1 });\n console.log(map.getTerrain());\n}\n\nfunction getTerrainSourceID(map) {\n for (const [key, source] of Object.entries(map.getStyle().sources)) {\n if (source.type == \"raster-dem\") {\n return key;\n }\n }\n return null;\n}\n",".feature-panel\n position: relative\n margin: 0 -1em\n\n.key-value\n display: inline-block\n margin-right: 1em\n .key\n font-weight: bold\n font-size: 0.9em\n &:after\n content: ': '\n .value\n font-size: 0.9em\n\n.feature-properties\n position: relative\n &:before\n content: \"–\"\n position: absolute\n top: 4px\n left: 0\n\n.feature-header h3\n margin-bottom: 0\n margin-top: 0.5em\n\n.feature-group\n border-bottom: 1px solid var(--panel-rule-inner)\n margin-bottom: 0.5em\n &:last-child\n border-bottom: none\n\n.tile-info\n display: flex\n flex-direction: row\n align-items: baseline\n h3\n margin-right: 0.5em\n\n.opacity-slider\n margin: 0 1em 0.5em\n :global\n .bp5-slider-handle .bp5-slider-label\n background-color: var(--secondary-color)\n color: var(--text-color)\n\n.unit-number\n .unit\n font-size: 0.9em\n margin-left: 0.2em\n font-weight: bold\n\n.page\n margin: 2em auto\n max-width: 50em\n\n.dev-index-page\n overflow-y: scroll\n","import { useMapConditionalStyle, useMapRef } from \"@macrostrat/mapbox-react\";\nimport { tileToGeoJSON } from \"@mapbox/tilebelt\";\nimport { useCallback } from \"react\";\n\ntype TileIndex = { x: number; y: number; z: number };\n\nexport function TileExtentLayer({\n tile,\n color = \"red\",\n}: {\n tile: TileIndex | null;\n color?: string;\n}) {\n const styleCallback = useCallback(\n (map, val: TileIndex) => {\n const style = map.getStyle();\n if (style.layers == null) return;\n style.layers = style.layers.filter((l) => l.id != \"tile-extent\");\n if (val == null) {\n return map.setStyle(style);\n }\n const { x, y, z } = val;\n const extent = tileToGeoJSON([x, y, z]);\n const source = {\n type: \"geojson\",\n data: extent,\n };\n const layer = {\n id: \"tile-extent\",\n type: \"line\",\n source: \"tile-extent\",\n paint: {\n \"line-color\": color,\n \"line-width\": 2,\n },\n };\n style.sources[\"tile-extent\"] = source;\n style.layers.push(layer);\n map.setStyle(style);\n },\n [color]\n );\n const map = useMapRef();\n useMapConditionalStyle(map, tile, styleCallback);\n return null;\n}\n","import { Spinner, Switch } from \"@blueprintjs/core\";\nimport { useMapRef, useMapStatus } from \"@macrostrat/mapbox-react\";\nimport mapboxgl from \"mapbox-gl\";\nimport hyper from \"@macrostrat/hyper\";\nimport styles from \"./main.module.sass\";\nimport { useEffect, useState } from \"react\";\nimport { JSONView, usePrevious } from \"@macrostrat/ui-components\";\nimport { group } from \"d3-array\";\nimport { ExpansionPanel } from \"../expansion-panel\";\n\nconst h = hyper.styled(styles);\n\nexport function FeatureProperties({ data, ...rest }) {\n return h(\"div.feature-properties\", [\n h(JSONView, {\n data,\n hideRoot: true,\n ...rest,\n }),\n ]);\n}\n\nexport function FeatureRecord({ feature }) {\n const props = feature.properties;\n return h(\"div.feature-record\", [\n h.if(Object.keys(props).length > 0)(FeatureProperties, { data: props }),\n ]);\n}\n\nexport function FeatureSelectionHandler({\n selectedLocation,\n setFeatures,\n radius = 2,\n}: {\n selectedLocation: mapboxgl.LngLat;\n setFeatures: (features: mapboxgl.MapboxGeoJSONFeature[]) => void;\n radius?: number;\n}) {\n const mapRef = useMapRef();\n const { isLoading } = useMapStatus();\n const prevLocation = usePrevious(selectedLocation);\n\n useEffect(() => {\n const map = mapRef?.current;\n if (map == null) return;\n if (selectedLocation == null) {\n setFeatures(null);\n return;\n }\n\n // Don't update if the location hasn't changed\n if (selectedLocation == prevLocation) return;\n\n const r = radius;\n const pt = map.project(selectedLocation);\n\n const bbox: [mapboxgl.PointLike, mapboxgl.PointLike] = [\n [pt.x - r, pt.y - r],\n [pt.x + r, pt.y + r],\n ];\n const features = map.queryRenderedFeatures(bbox);\n setFeatures(features);\n }, [mapRef.current, prevLocation?.current, selectedLocation, isLoading]);\n\n return null;\n}\n\nfunction FeatureHeader({ feature }) {\n return h(\"div.feature-header\", [\n h(\"h3\", [\n h(KeyValue, { label: \"Source\", value: feature.source }),\n h(KeyValue, { label: \"Source layer\", value: feature.sourceLayer }),\n ]),\n ]);\n}\n\nfunction KeyValue({ label, value }) {\n return h(\"span.key-value\", [h(\"span.key\", label), h(\"code.value\", value)]);\n}\n\nfunction LoadingAwareFeatureSet({ features, sourceID }) {\n const map = useMapRef();\n if (map?.current == null) return null;\n const [isLoaded, setIsLoaded] = useState(false);\n\n const sourceFeatures = features.filter((d) => d.source == \"burwell\");\n\n useEffect(() => {\n if (sourceFeatures.length > 0) {\n setIsLoaded(true);\n return;\n }\n\n const isLoaded = map.current.isSourceLoaded(sourceID);\n setIsLoaded(isLoaded);\n if (!isLoaded) {\n map.current.once(\"sourcedata\", (e) => {\n if (e.sourceId == sourceID) {\n setIsLoaded(true);\n }\n });\n }\n }, [map.current, sourceID, sourceFeatures.length]);\n\n if (!isLoaded) return h(Spinner);\n return h(Features, { features: sourceFeatures });\n}\n\nexport function TileInfo({ feature, showExtent, setShowExtent }) {\n if (feature == null) return null;\n const size = feature._vectorTileFeature._pbf.length;\n return h(\"div.tile-info\", [\n h(\"h3\", \"Tile\"),\n h(\"div.tile-index\", [\n h(KeyValue, { label: \"x\", value: feature._x }),\n h(KeyValue, { label: \"y\", value: feature._y }),\n h(KeyValue, { label: \"z\", value: feature._z }),\n ]),\n h(\"div.spacer\"),\n h(KeyValue, { label: \"Size\", value: formatSize(size) }),\n h(Switch, {\n label: \"Show extent\",\n alignIndicator: \"right\",\n checked: showExtent,\n onChange() {\n setShowExtent(!showExtent);\n },\n }),\n ]);\n}\n\nfunction formatSize(size: number) {\n if (size > 1000000)\n return h(UnitNumber, { value: size / 1000000, unit: \"Mb\" });\n if (size > 1000) return h(UnitNumber, { value: size / 1000, unit: \"Kb\" });\n return `${size} bytes`;\n}\n\nfunction UnitNumber({ value, unit, precision = 1 }) {\n return h(\"span.unit-number\", [\n h(\"span.number\", value.toFixed(precision)),\n h(\"span.unit\", unit),\n ]);\n}\n\nexport function FeaturePanel({\n features,\n focusedSource = null,\n focusedSourceTitle = null,\n}) {\n if (features == null) return null;\n\n let focusedSourcePanel = null;\n let filteredFeatures = features;\n let title = \"Features\";\n\n if (focusedSource != null) {\n title = \"Basemap features\";\n focusedSourcePanel = h(\n ExpansionPanel,\n {\n title: \"Macrostrat features\",\n className: \"macrostrat-features\",\n expanded: true,\n },\n [\n h(LoadingAwareFeatureSet, {\n features,\n sourceID: focusedSource,\n }),\n ]\n );\n filteredFeatures = features.filter((d) => d.source != focusedSource);\n }\n\n return h(\"div.feature-panel\", [\n focusedSourcePanel,\n h(\n ExpansionPanel,\n { title, className: \"basemap-features\", expanded: focusedSource == null },\n [\n h(FeatureGroups, {\n features: filteredFeatures,\n }),\n ]\n ),\n ]);\n}\n\nfunction FeatureGroups({ features }) {\n /** Group features by source and sourceLayer */\n if (features == null) return null;\n\n const groups = group(features, (d) => `${d.source} - ${d.sourceLayer}`);\n\n return h(\n \"div.feature-groups\",\n Array.from(groups).map(([key, features]) => {\n return h(\"div.feature-group\", [\n h(FeatureHeader, { feature: features[0] }),\n h(Features, { features }),\n ]);\n })\n );\n}\n\nexport function Features({ features }) {\n return h(\n \"div.features\",\n features.map((feature, i) => h(FeatureRecord, { key: i, feature }))\n );\n}\n","import { useState } from \"react\";\nimport { Collapse, Icon } from \"@blueprintjs/core\";\nimport hyper from \"@macrostrat/hyper\";\nimport styles from \"./main.module.sass\";\nimport classNames from \"classnames\";\nimport { Button } from \"@blueprintjs/core\";\nimport { PanelSubhead } from \"./headers\";\n\nconst h = hyper.styled(styles);\n\nfunction ExpansionPanelSummary(props) {\n const { expanded, children, onChange, className, title, titleComponent } =\n props;\n const icon = expanded ? \"chevron-up\" : \"chevron-down\";\n return h(\n PanelSubhead,\n {\n className: classNames(\"expansion-panel-header\", className),\n onClick: onChange,\n title,\n component: titleComponent,\n },\n [children, h(Icon, { icon })]\n );\n}\n\nfunction ExpansionPanelBase(props) {\n let {\n title,\n titleComponent = \"h3\",\n children,\n expanded,\n helpText,\n onChange = () => {},\n sideComponent = null,\n className,\n } = props;\n const [isOpen, setOpen] = useState(expanded || false);\n\n const onChange_ = () => {\n onChange();\n setOpen(!isOpen);\n };\n\n return h(\n \"div.expansion-panel-base\",\n {\n className: classNames(className, {\n expanded: isOpen,\n collapsed: !isOpen,\n }),\n },\n [\n h(\n ExpansionPanelSummary,\n {\n onChange: onChange_,\n expanded: isOpen,\n title,\n titleComponent,\n },\n h(\"div.expansion-summary-title-help\", [\n h(\"span.expansion-panel-subtext\", helpText),\n \" \",\n sideComponent,\n ])\n ),\n h(Collapse, { isOpen }, h(\"div.expansion-children\", null, children)),\n ]\n );\n}\n\nexport function InfoPanelSection(props) {\n let { title, children, className, headerElement = null } = props;\n return h(\"div.info-panel-section\", { className }, [\n h(\"div.panel-subhead\", null, headerElement ?? h(\"h3\", title)),\n h(\"div.panel-content\", null, children),\n ]);\n}\n\nfunction ExpansionPanel(props) {\n return h(ExpansionPanelBase, {\n ...props,\n className: \"expansion-panel\",\n });\n}\n\nfunction SubExpansionPanel(props) {\n return h(ExpansionPanelBase, {\n ...props,\n className: \"expansion-panel sub-expansion-panel\",\n titleComponent: \"h4\",\n });\n}\n\nfunction ExpandableDetailsPanel(props) {\n let { title, children, value, headerElement, className } = props;\n const [isOpen, setIsOpen] = useState(false);\n headerElement ??= h([h(\"div.title\", title), value]);\n return h(\"div.expandable-details\", { className }, [\n h(\"div.expandable-details-main\", [\n h(\"div.expandable-details-header\", headerElement),\n h(\"div.expandable-details-toggle\", [\n h(Button, {\n small: true,\n minimal: true,\n active: isOpen,\n onClick: () => setIsOpen(!isOpen),\n icon: \"more\",\n }),\n ]),\n ]),\n h(\n Collapse,\n { isOpen },\n h(\"div.expandable-details-children\", null, children)\n ),\n ]);\n}\n\nfunction ExpansionBody({ title, className, children }) {\n return h(\"div.expansion-body\", { className }, [\n h(\"div.expansion-panel-detail-header\", title),\n h(\"div.expansion-panel-detail-body\", null, children),\n ]);\n}\n\nexport {\n ExpansionPanel,\n ExpansionPanelSummary,\n ExpandableDetailsPanel,\n SubExpansionPanel,\n ExpansionBody,\n PanelSubhead,\n};\n","\n.panel-subhead\n padding: 0.2em var(--box-horizontal-padding)\n border-top: 1px solid var(--panel-rule-color)\n border-bottom: 1px solid var(--panel-rule-color)\n background-color: var(--accent-color)\n display: flex\n flex-direction: row\n align-items: center\n z-index: 1\n gap: var(--box-horizontal-padding)\n top: -1px\n position: sticky\n h1, h2, h3, h4\n font-family: Montserrat,sans-serif\n font-weight: 700\n margin: 0.2em 0\n h4\n font-weight: 600\n .title\n flex-grow: 1\n\n// :global(.bp5-dark) .panel-subhead\n// margin 0 1px\n\n.info-panel-section\n &>.panel-subhead\n margin: -1px calc(var(--panel-padding-h) * -1) 0\n\n.expansion-panel\n padding: 0\n flex-wrap: wrap\n margin-top: -1px\n // &.collapsed\n // .expansion-panel-header\n // border-bottom-width: 0;\n\n.sub-expansion-panel\n margin: -1px calc(var(--panel-padding-h) * -0.5) 0\n overflow: hidden\n &:first-child\n .expansion-panel-header\n border-top-width: 0\n .panel-subhead\n border-top: none\n border-bottom: none\n\n .expansion-panel-header\n background-color: var(--accent-secondary-color)\n cursor: pointer\n &:hover\n background-color: var(--accent-secondary-hover-color)\n h2, h3, h4\n font-weight: 500\n border-bottom: 1px solid var(--tertiary-border-color)\n border-top: 1px solid var(--tertiary-border-color)\n margin-top: -1px\n padding: 5px 1em 5px\n align-items: center\n\n.expansion-summary-title-help\n margin-left: 5px\n :global(.bp5-icon)\n margin-left: 5px\n\n.expansion-panel-header\n cursor: pointer\n &:hover\n background-color: var(--accent-hover-color)\n :global(.bp5-icon)\n transform: translate(0,3px)\n\n.expansion-children\n padding: 5px 1em 10px\n .expansion-panel\n margin-left: -1em\n margin-right: -1em\n &:first-child\n margin-top: -5px\n\n.expansion-panel-subtext\n font-size: 85%\n font-weight: 400\n\n:global\n .expansion-panel-root\n padding-left: 15px !important\n\n .expansion-panel-detail\n display: block !important\n padding: 0 !important\n\n .expansion-panel-detail-sub\n display: block !important\n\n// New expandable panel for details\n.expandable-details-main\n display: flex\n flex-direction: row\n align-items: center\n justify-content: space-between\n margin: 3px 0\n\n.expandable-details-header\n display: inline-flex\n flex-direction: row\n align-items: baseline\n flex-grow: 1\n\n.expandable-details-children\n position: relative\n\n.expandable-details-toggle\n :global(.bp5-button)\n font-size: 10px\n\n.expandable-details\n &.macrostrat-unit\n .title:after\n content: none\n .title\n margin-right: 1em\n &:after\n content: \":\"\n\n.expansion-body\n display: inline-block\n //flex-direction row\n align-items: baseline\n background-color: var(--tertiary-background)\n padding: 2px 6px\n border-radius: 4px\n width: 100%\n box-shadow: 0px 1px 2px 1px rgba(0,0,0,0.2)\n margin-bottom: 6px\n\n.expansion-panel-detail-header\n font-size: 90%\n font-style: italic\n margin-right: 1em\n display: inline\n color: var(--secondary-color)\n &:after\n content: \":\"\n\n.expansion-panel-detail-body\n display: inline\n","import hyper from \"@macrostrat/hyper\";\nimport styles from \"./main.module.sass\";\n\nconst h = hyper.styled(styles);\n\nexport function PanelSubhead(props) {\n const { title, component = \"h3\", children, ...rest } = props;\n return h(\"div.panel-subhead\", rest, [\n h(\n component,\n {\n className: \"title\",\n },\n title\n ),\n children,\n ]);\n}\n"],"names":["useMemo","Navbar","Button","Spinner","Card","hyper","styles","useMapStatus","h","styled","spinnerElement","size","LoadingButton","isLoading","onClick","active","icon","className","large","minimal","MapLoadingButton","props","mapIsLoading","FloatingNavbar","children","statusElement","if","module","exports","InfoDrawerHeader","classNames","ErrorBoundary","InfoDrawerContainer","BaseInfoDrawer","headerElement","title","onClose","rest","header","LocationPanel","loading","cls","Icon","useToaster","LngLatCoords","Elevation","LocationFocusButton","useFocusState","isCentered","PositionButton","position","showCopyLink","focusState","copyLinkIsVisible","location","CopyLinkButton","itemName","toaster","message","rightIcon","small","navigator","clipboard","writeText","window","href","then","show","intent","timeout","zoom","elevation","showCopyPositionButton","formatCoordForZoomLevel","metersToFeet","normalizeLng","formatValue","ValueWithUnit","value","unit","DegreeCoord","labels","precision","format","direction","Math","abs","lat","lng","Array","isArray","val","_","includeFeet","fmt4","fmt3","fmt2","fmt1","fmtInt","applyMapPositionToHash","args","mapPosition","pos","camera","target","x","y","bearing","pitch","z","altitude","az","a","e","_fmt","parseFloat","toString","getMapPositionForHash","hashData","centerPosition","_z","endsWith","substring","length","undefined","Switch","Spacer","useDarkMode","useStoredState","mapboxgl","useCallback","useState","useEffect","buildInspectorStyle","MapAreaContainer","PanelCard","MapMarker","MapView","TileExtentLayer","FeaturePanel","FeatureSelectionHandler","TileInfo","MapInspector","transformRequest","mapboxToken","overlayStyle","style","focusedSource","focusedSourceTitle","fitViewport","projection","dark","isEnabled","accessToken","isOpen","setOpen","state","setState","showTileExtent","xRay","actualStyle","setActualStyle","inDarkMode","inspectPosition","setInspectPosition","data","setData","onSelectPosition","detailElement","feature","showExtent","setShowExtent","features","tile","f","_x","_y","navbar","contextPanel","checked","label","onChange","detailPanel","contextPanelOpen","name","selectedLocation","setFeatures","setPosition","color","DevMapPage","getMapboxStyle","mergeStyles","chroma","buildXRayStyle","baseStyle","params","xRaySources","access_token","sources","Object","keys","layers","layer","includes","source","push","newLayer","transformMapboxLayer","c","xRayColor","opacity","darken","alpha","css","type","paint","_xRaySources","overlay","addClassNames","useTransition","MapboxMapProvider","ZoomControl","useMapPosition","ToasterContext","MapBottomControls","mapViewInfo","DetailPanelStyle","_MapAreaContainer","detailPanelOpen","bottomPanel","mainPanel","mapControls","contextStackProps","detailStackProps","detailPanelStyle","FLOATING","showPanelOutlines","preventMapInteraction","_detailPanelOpen","contextPanelTrans","detailPanelTrans","mainUIClassNames","stage","mapControlsExt","detailStackExt","MapStyledContainer","ContextStack","shouldMount","FIXED","adaptiveWidth","props1","MapProviders","mapIsRotated","mapUse3D","mapIsGlobal","useRef","GeolocateControl","CompassControl","GlobeControl","ThreeDControl","MapControlWrapper","ScaleControl","BaseScaleControl","DevToolsButtonSlot","optionsRef","maxWidth","control","options","current","GeolocationControl","showAccuracyCircle","showUserLocation","trackUserLocation","positionOptions","enableHighAccuracy","isInitialized","useMapRef","useMapEaseTo","useMapDispatch","debounce","useResizeObserver","getMapPosition","getMapPadding","useMapMarker","MapResizeManager","containerRef","mapRef","debouncedResize","resize","ref","onResize","MapPaddingManager","parentRef","infoMarkerPosition","padding","setPadding","updateMapPadding","newPadding","map","sz","center","MapMovedReporter","onMapMoved","dispatch","mapMovedCallback","payload","cb","on","off","MapLoadingReporter","ignoredSources","onMapLoading","onMapIdle","loadingRef","didSendLoading","loadingCallback","evt","sourceId","idleCallback","centerMarker","markerRef","handleMapClick","event","lngLat","flyTo","duration","Marker","calcMapPadding","rect","childRect","left","max","top","right","bottom","getBoundingClientRect","markerPosition","remove","marker","setLngLat","addTo","setMapPosition","enable3DTerrain","defaultInitializeMap","container","console","log","Map","maxZoom","logoPosition","trackResize","antialias","optimizeForTerrain","defaultMapPosition","terrainSourceID","enableTerrain","initializeMap","onMapLoaded","onStyleLoaded","_mapboxToken","setStyle","animate","_computedMapPosition","_projection","getProjection","MapTerrainManager","shouldEnable","sourceID","_loaded","once","currentTerrainSource","getTerrainSourceID","demSourceID","currentTerrain","getTerrain","setTerrain","getSource","addSource","url","tileSize","maxzoom","getLayer","addLayer","id","exaggeration","key","entries","getStyle","useMapConditionalStyle","tileToGeoJSON","styleCallback","filter","l","extent","JSONView","usePrevious","group","ExpansionPanel","FeatureProperties","hideRoot","FeatureRecord","properties","radius","prevLocation","r","pt","project","bbox","queryRenderedFeatures","FeatureHeader","KeyValue","sourceLayer","LoadingAwareFeatureSet","isLoaded","setIsLoaded","sourceFeatures","d","isSourceLoaded","Features","_vectorTileFeature","_pbf","formatSize","alignIndicator","UnitNumber","toFixed","focusedSourcePanel","filteredFeatures","expanded","FeatureGroups","groups","from","i","Collapse","PanelSubhead","ExpansionPanelSummary","titleComponent","component","ExpansionPanelBase","helpText","sideComponent","onChange_","collapsed","InfoPanelSection","SubExpansionPanel","ExpandableDetailsPanel","setIsOpen","ExpansionBody"],"version":3,"file":"module.js.map"}
|
|
1
|
+
{"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AEAA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AAJA,4CAAmC,CAAC,sBAAsB,CAAC;AAC3D,4CAAkC,CAAC,qBAAqB,CAAC;AACzD,4CAA8B,CAAC,iBAAiB,CAAC;AACjD,4CAAqC,CAAC,wBAAwB,CAAC;AAC/D,4CAAkC,CAAC,qBAAqB,CAAC;;;;ADEzD,MAAM,0BAAI,CAAA,GAAA,sBAAI,EAAE,MAAM,CAAC,CAAA,GAAA,gEAAK;AAE5B,MAAM,uCAAiB,wBAAE,CAAA,GAAA,cAAM,GAAG;IAAE,MAAM;AAAG;AAEtC,SAAS,0CAAc,aAC5B,YAAY,gBACZ,OAAO,UACP,SAAS,aACT,OAAO,QACR;IACC,OAAO,wBAAE,CAAA,GAAA,aAAK,GAAG;QACf,WAAW;QACX,MAAM,YAAY,uCAAiB;QACnC,OAAO;QACP,SAAS;iBACT;QACA,QAAQ,UAAU,CAAC;IACrB;AACF;AAEO,SAAS,0CAAiB,KAAK;IACpC,MAAM,aAAE,SAAS,EAAE,GAAG,CAAA,GAAA,mBAAW;IACjC,MAAM,eAAe,CAAA,GAAA,cAAM,EAAE,IAAM,WAAW;QAAC;KAAU;IACzD,OAAO,wBAAE,2CAAe;QAAE,GAAG,KAAK;QAAE,WAAW;IAAa;AAC9D;AAIO,SAAS,0CAAe,aAC7B,SAAS,YACT,QAAQ,iBACR,gBAAgB,MAKjB;IACC,OAAO,wBAAE,wBAAwB;mBAAE;IAAU,GAAG;QAC9C,wBAAE,qBAAqB;YACrB,wBAAE,CAAA,GAAA,aAAK,GAAG;gBAAE,WAAW;YAAkB,GAAG;SAC7C;QACD,wBAAE,EAAE,CAAC,iBAAiB,MACpB,CAAA,GAAA,WAAG,GACH;YAAE,WAAW;QAAgB,GAC7B;KAEH;AACH;;;;;;;;;;;;;;;;;;;;;;;;AIrDA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AATA,4CAAqC,CAAC,uBAAuB,CAAC;AAC9D,4CAA+B,CAAC,iBAAiB,CAAC;AAClD,4CAAoC,CAAC,sBAAsB,CAAC;AAC5D,4CAAwC,CAAC,0BAA0B,CAAC;AACpE,4CAA2C,CAAC,6BAA6B,CAAC;AAC1E,4CAA8B,CAAC,gBAAgB,CAAC;AAChD,4CAA4B,CAAC,cAAc,CAAC;AAC5C,4CAA0C,CAAC,4BAA4B,CAAC;AACxE,2CAAsC,CAAC,wBAAwB,CAAC;AAChE,4CAA2B,CAAC,aAAa,CAAC;;;;;;;;;;;;;AEPnC,MAAM,4CAAO,CAAA,GAAA,aAAK,EAAE;AACpB,MAAM,4CAAO,CAAA,GAAA,aAAK,EAAE;AACpB,MAAM,4CAAO,CAAA,GAAA,aAAK,EAAE;AACpB,MAAM,4CAAO,CAAA,GAAA,aAAK,EAAE;AACpB,MAAM,4CAAS,CAAA,GAAA,aAAK,EAAE;AAEtB,SAAS,0CAAY,GAAW,EAAE,YAAoB,CAAC;IAC5D,OAAQ;QACN,KAAK;YACH,OAAO,0CAAK;QACd,KAAK;YACH,OAAO,0CAAK;QACd,KAAK;YACH,OAAO,0CAAK;QACd,KAAK;YACH,OAAO,0CAAK;QACd,KAAK;YACH,OAAO,0CAAO;QAChB;YACE,OAAO,0CAAK;IAChB;AACF;;;;;;;;;ACPO,SAAS,0CACd,IAAwB,EACxB,WAA+B;IAE/B,MAAM,MAAM,aAAa;IACzB,IAAI,OAAO,MAAM;IACjB,MAAM,OAAO,YAAY,MAAM,EAAE;IAEjC,KAAK,CAAC,GAAG,CAAA,GAAA,8BAAsB,EAAE,IAAI,GAAG,EAAE;IAC1C,KAAK,CAAC,GAAG,CAAA,GAAA,8BAAsB,EAAE,IAAI,GAAG,EAAE;IAE1C,IAAI,IAAI,OAAO,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK,QAAQ,MAChD,KAAK,CAAC,GAAG,CAAA,GAAA,yCAAG,EAAE;SACT,IAAI,IAAI,QAAQ,IAAI;QACzB,IAAI,IAAI,QAAQ,GAAG,MACjB,KAAK,CAAC,GAAG,CAAA,GAAA,yCAAG,EAAE,IAAI,QAAQ,GAAG,QAAQ;aAErC,KAAK,CAAC,GAAG,CAAA,GAAA,yCAAK,EAAE,IAAI,QAAQ,IAAI;;IAGpC,IAAI,IAAI,OAAO,IAAI,GAAG;QACpB,IAAI,KAAK,IAAI,OAAO;QACpB,IAAI,KAAK,GAAG,MAAM;QAClB,KAAK,CAAC,GAAG,CAAA,GAAA,yCAAK,EAAE;IAClB;IACA,IAAI,IAAI,KAAK,IAAI,GACf,KAAK,CAAC,GAAG,CAAA,GAAA,yCAAK,EAAE,IAAI,KAAK;AAE7B;AAEA,SAAS,2BAAK,CAA6B;IACzC,IAAI,MAAM,OAAO,CAAC,IAChB,IAAI,CAAC,CAAC,EAAE;IAEV,OAAO,WAAW,EAAE,QAAQ;AAC9B;AAEO,SAAS,0CACd,QAA6B,EAC7B,cAA6B;IAE7B,MAAM,KACJ,IAAI,gBAAgB,OAAO,MAC3B,IAAI,gBAAgB,OAAO,MAC3B,mEAAmE;IACnE,IAAI,kBAAkB,OAAO,IAAI,MACjC,IAAI,MACJ,IAAI,GACL,GAAG;IAEJ,MAAM,MAAM,2BAAK;IACjB,MAAM,MAAM,2BAAK;IAEjB,IAAI,WAAW;IACf,IAAI,OAAO;IACX,MAAM,KAAK,EAAE,QAAQ;IACrB,IAAI,GAAG,QAAQ,CAAC,OACd,WAAW,2BAAK,GAAG,SAAS,CAAC,GAAG,GAAG,MAAM,GAAG,MAAM;SAC7C,IAAI,GAAG,QAAQ,CAAC,MACrB,WAAW,2BAAK,GAAG,SAAS,CAAC,GAAG,GAAG,MAAM,GAAG;SAE5C,OAAO,2BAAK;IAEd,MAAM,UAAU,2BAAK;IACrB,MAAM,QAAQ,2BAAK;IAEnB,IAAI,SAAS;IACb,IAAI,WAAW,KAAK,SAAS,KAAK,QAAQ,MACxC,SAAS;aACP;aACA;cACA;IACF;IAGF,OAAO;QACL,QAAQ;YACN,KAAK,2BAAK;YACV,KAAK,2BAAK;sBACV;YACA,SAAS,2BAAK;YACd,OAAO,2BAAK;QACd;gBACA;IACF;AACF;;;AF3FO,SAAS,0CAAc,KAAK;IACjC,MAAM,SAAE,KAAK,QAAE,IAAI,EAAE,GAAG;IACxB,OAAO,CAAA,GAAA,sBAAA,EAAE,wBAAwB;QAC/B,CAAA,GAAA,sBAAA,EAAE,cAAc;YAAC;SAAM;QACvB,CAAA,GAAA,sBAAA,EAAE,eAAe;YAAC;SAAI;QACtB,CAAA,GAAA,sBAAA,EAAE,aAAa;YAAC;SAAK;KACtB;AACH;AAEO,SAAS,0CAAY,KAAK;IAC/B,MAAM,SAAE,KAAK,UAAE,MAAM,aAAE,YAAY,WAAG,SAAS,CAAA,GAAA,yCAAU,GAAG,GAAG;IAC/D,MAAM,YAAY,QAAQ,IAAI,MAAM,CAAC,EAAE,GAAG,MAAM,CAAC,EAAE;IAEnD,OAAO,CAAA,GAAA,sBAAA,EAAE,2CAAe;QACtB,OAAO,OAAO,KAAK,GAAG,CAAC,QAAQ,aAAa;QAC5C,MAAM;IACR;AACF;AAcO,SAAS,0CAAa,KAAkB;IAC7C,qCAAqC,GACrC,MAAM,YAAE,QAAQ,aAAE,SAAS,aAAE,SAAS,QAAE,IAAI,EAAE,GAAG;IACjD,IAAI,UAAE,MAAM,EAAE,GAAG;IACjB,IAAI,YAAY,MACd,OAAO;IAET,IAAI,KAAK;IACT,IAAI,MAAM,OAAO,CAAC,WAChB,CAAC,KAAK,IAAI,GAAG;SAEZ,CAAA,OAAE,GAAG,OAAE,GAAG,EAAE,GAAG,QAAO;IAGzB,IAAI,QAAQ,QAAQ,UAAU,QAAQ,aAAa,MACjD,SAAS,CAAC,KAAK,IAAM,CAAA,GAAA,8BAAsB,EAAE,KAAK;IAGpD,OAAO,CAAA,GAAA,sBAAA,EAAE,wBAAwB;mBAAE;IAAU,GAAG;QAC9C,CAAA,GAAA,sBAAA,EAAE,eAAe;YACf,CAAA,GAAA,sBAAA,EAAE,2CAAa;gBACb,OAAO;gBACP,QAAQ;oBAAC;oBAAK;iBAAI;2BAClB;wBACA;YACF;YACA;YACA,CAAA,GAAA,sBAAA,EAAE,2CAAa;gBACb,OAAO,CAAA,GAAA,mBAAW,EAAE;gBACpB,QAAQ;oBAAC;oBAAK;iBAAI;2BAClB;wBACA;YACF;SACD;KACF;AACH;AAEO,SAAS,0CAAU,KAAK;IAC7B,iFAAiF,GACjF,MAAM,aAAE,SAAS,aAAE,SAAS,eAAE,cAAc,MAAM,GAAG;IACrD,IAAI,aAAa,MAAM,OAAO;IAC9B,OAAO,CAAA,GAAA,sBAAA,EAAE,iBAAiB;mBAAE;IAAU,GAAG;QACvC,CAAA,GAAA,sBAAA,EAAE,2CAAe;YAAE,OAAO;YAAW,MAAM;QAAI;QAC/C,CAAA,GAAA,sBAAA,EAAE,EAAE,CAAC,aAAa,kBAAkB;YAClC;YACA,CAAA,GAAA,sBAAA,EAAE,2CAAe;gBAAE,OAAO,CAAA,GAAA,mBAAW,EAAE;gBAAY,MAAM;YAAK;YAC9D;SACD;KACF;AACH;;;;;AF/EA,MAAM,0BAAI,CAAA,GAAA,sBAAI,EAAE,MAAM,CAAC,CAAA,GAAA,gEAAK;AAE5B,SAAS,qCAAe,YAAE,QAAQ,gBAAE,eAAe,OAAO;IACxD,MAAM,aAAa,CAAA,GAAA,oBAAY,EAAE;IAEjC,MAAM,oBAAoB,CAAA,GAAA,iBAAS,EAAE,eAAe;IAEpD,OAAO,wBAAE,yBAAyB;QAChC,wBAAE,CAAA,GAAA,0BAAkB,GAAG;YAAE,UAAU;wBAAU;QAAW,GAAG,EAAE;QAC7D,wBAAE,EAAE,CAAC,mBAAmB,sCAAgB;YAAE,UAAU;QAAW;KAChE;AACH;AAEA,SAAS,qCAAe,YAAE,QAAQ,YAAE,QAAQ,WAAE,OAAO,EAAE,GAAG,MAAM;IAC9D,MAAM,UAAU,CAAA,GAAA,iBAAS;IAEzB,IAAI,UAAU,CAAC,WAAW,CAAC;IAC3B,IAAI,YAAY,MACd,WAAW,CAAC,IAAI,EAAE,SAAS,CAAC;IAE9B,WAAW;IAEX,OAAO,wBACL,CAAA,GAAA,aAAK,GACL;QACE,WAAW;QACX,WAAW,wBAAE,CAAA,GAAA,WAAG,GAAG;YAAE,MAAM;YAAQ,MAAM;QAAG;QAC5C,SAAS;QACT,OAAO;QACP;YACE,UAAU,SAAS,CAAC,SAAS,CAAC,OAAO,QAAQ,CAAC,IAAI,EAAE,IAAI,CACtD;gBACE,SAAS,KAAK;6BACZ;oBACA,QAAQ;oBACR,MAAM;oBACN,SAAS;gBACX;gBACA;YACF,GACA;gBACE,SAAS,KAAK;oBACZ,SAAS;oBACT,QAAQ;oBACR,MAAM;oBACN,SAAS;gBACX;YACF;QAEJ;QACA,GAAG,IAAI;IACT,GACA,YAAY;AAEhB;AAUO,SAAS,0CAAiB,KAA4B;IAC3D,MAAM,WACJ,OAAO,YACP,QAAQ,QACR,OAAO,cACP,SAAS,0BACT,sBAAsB,EACvB,GAAG;IAEJ,OAAO,wBAAE,gCAAgC;QACvC,wBAAE,sCAAgB;sBAAE;YAAU,cAAc;QAAuB;QACnE,wBAAE;QACF,wBAAE,CAAA,GAAA,yCAAW,GAAG;sBACd;kBACA;YACA,WAAW;QACb;QACA,wBAAE,EAAE,CAAC,aAAa,MAAM,CAAA,GAAA,yCAAQ,GAAG;uBACjC;YACA,WAAW;QACb;QACA,wBAAE,CAAA,GAAA,aAAK,GAAG;YAAE,SAAS;YAAM,MAAM;YAAS,SAAS;QAAQ;KAC5D;AACH;;;;;;AD3FA,MAAM,0BAAI,CAAA,GAAA,sBAAI,EAAE,MAAM,CAAC,CAAA,GAAA,gEAAK;AAErB,SAAS,0CAAoB,KAAK;IACvC,MAAM,YAAY,CAAA,GAAA,iBAAS,EAAE,cAAc,MAAM,SAAS;IAC1D,OAAO,wBAAE,CAAA,GAAA,WAAG,GAAG;QAAE,GAAG,KAAK;mBAAE;IAAU;AACvC;AASO,SAAS,0CAAe,KAA0B;IACvD,MAAM,aACJ,SAAS,iBACT,gBAAgB,aAChB,KAAK,WACL,OAAO,YACP,QAAQ,EACR,GAAG,MACJ,GAAG;IACJ,MAAM,SACJ,iBACA,wBAAE,CAAA,GAAA,yCAAe,GAAG;iBAAE;QAAS,GAAG,IAAI;IAAC,GAAG;QACxC,SAAS,OAAO,OAAO,wBAAE,MAAM;YAAC;SAAM;KACvC;IACH,OAAO,wBAAE,2CAAqB;mBAAE;IAAU,GAAG;QAC3C;QACA,wBACE,uBACA,wBAAE,2BAA2B,wBAAE,CAAA,GAAA,oBAAY,GAAG,MAAM;KAEvD;AACH;AAEO,SAAS,0CAAc,KAAK;IACjC,MAAM,YAAE,QAAQ,aAAE,SAAS,WAAE,UAAU,OAAO,GAAG,MAAM,GAAG;IAC1D,MAAM,MAAM,CAAA,GAAA,iBAAS,EAAE,kBAAkB,WAAW;iBAAE;IAAQ;IAC9D,OAAO,wBAAE,2CAAgB;QAAE,WAAW;QAAK,GAAG,IAAI;IAAC,GAAG;AACxD;;;;;;;;;AOhDA,0BAA0B;;;;;;;;;;;;ACWnB,eAAe,0CACpB,SAA0B,EAC1B,SAAsB,IAAI;IAE1B,MAAM,cACJ,aAAa,cACb,QAAQ,kCACR,WAAW,eACX,WAAW,EACZ,GAAG;IACJ,MAAM,QAAQ,MAAM,CAAA,GAAA,qBAAa,EAAE,WAAW;QAAE,cAAc;IAAY;IAC1E,MAAM,UAAU,eAAe,OAAO,IAAI,CAAC,MAAM,OAAO;IAExD,IAAI,SAAS,EAAE;IACf,KAAK,IAAI,SAAS,MAAM,MAAM,CAAE;QAC9B,IAAI,CAAC,QAAQ,QAAQ,CAAC,MAAM,MAAM,GAAG;YACnC,OAAO,IAAI,CAAC;YACZ;QACF;QACA,IAAI,WAAW,2CAAqB,OAAO,OAAO;QAClD,IAAI,YAAY,MACd,OAAO,IAAI,CAAC;IAEhB;IAEA,OAAO;QACL,GAAG,KAAK;gBACR;IACF;AACF;AAEA,SAAS,2CAAqB,KAAK,EAAE,KAAK,EAAE,UAAU;IACpD,MAAM,IAAI,CAAA,GAAA,eAAK,EAAE;IACjB,MAAM,YAAY,CAAC,UAAU,CAAC,EAAE,SAAS,CAAC;QACxC,IAAI,CAAC,YACH,OAAO,CAAA,GAAA,eAAK,EAAE,OACX,MAAM,CAAC,IAAI,QACX,KAAK,CAAC,SACN,GAAG;QAER,OAAO,EAAE,KAAK,CAAC,SAAS,MAAM,CAAC,QAAQ,GAAG;IAC5C;IAEA,IAAI,MAAM,IAAI,IAAI,cAChB,OAAO;IAGT,IAAI,WAAW;QAAE,GAAG,KAAK;IAAC;IAE1B,IAAI,MAAM,IAAI,IAAI,QAChB,SAAS,KAAK,GAAG;QACf,cAAc,UAAU;QACxB,sBAAsB,UAAU;IAClC;SACK,IAAI,MAAM,IAAI,IAAI,QACvB,SAAS,KAAK,GAAG;QACf,cAAc,UAAU,KAAK;QAC7B,cAAc;IAChB;SACK,IAAI,MAAM,IAAI,IAAI,UACvB,SAAS,KAAK,GAAG;QACf,cAAc,UAAU,GAAG;QAC3B,mBAAmB;IACrB;SACK,IAAI,MAAM,IAAI,IAAI,UACvB,SAAS,KAAK,GAAG;QACf,gBAAgB,UAAU,KAAK;QAC/B,uBAAuB,UAAU,KAAK;QACtC,iBAAiB;IACnB;IAGF,OAAO;AACT;AAMO,eAAe,0CACpB,SAAkC,EAClC,eAA+C,IAAI,EACnD,SAAgC,CAAC,CAAC;IAElC,MAAM,eAAE,WAAW,QAAE,OAAO,OAAO,aAAa,YAAY,EAAE,GAAG,MAAM,GAAG;IAC1E,IAAI,cAAc;IAClB,IAAI,QAAQ,MAAM,CAAA,GAAA,qBAAa,EAAE,WAAW;QAC1C,cAAc;IAChB;IAEA,IAAI,gBAAgB,MAAM;QACxB,MAAM,UAAU,MAAM,CAAA,GAAA,qBAAa,EAAE,cAAc;YACjD,cAAc;QAChB;QACA,QAAQ,CAAA,GAAA,kBAAU,EAAE,OAAO;QAC3B,gBAAgB,OAAO,IAAI,CAAC,QAAQ,OAAO;IAC7C;IAGA,IAAI,MAAM;QACR,8DAA8D;QAC9D,gBAAgB,OAAO,IAAI,CAAC,MAAM,OAAO;QAEzC,QAAQ,MAAM,0CAAe,OAAO;YAAE,GAAG,IAAI;yBAAE;yBAAa;QAAY;IAC1E;IACA,OAAO;AACT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AErHA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AApDA,4CAAkC;AAClC,2CAAwC;AACxC,4CAAuC;AACvC,4CAAiC;AACjC,4CAAoC;AACpC,4CAAmC;AACnC,4CAAmC;AACnC,4CAAqC;AACrC,4CAAkC;AAClC,4CAAkC;AAClC,4CAAsC;AACtC,4CAAiC;AACjC,4CAAuC;AACvC,4CAAwC;AACxC,4CAAsC;AACtC,4CAA6B;AAC7B,4CAA2B;AAC3B,4CAA+B;AAC/B,4CAA+B;AAC/B,4CAAkC;AAClC,4CAA8B;AAC9B,4CAAiC;AACjC,4CAAoC;AACpC,4CAAgC;AAChC,4CAA2B;AAC3B,4CAAqC;AACrC,2CAAgC;AAChC,4CAA4B;AAC5B,4CAA+B;AAC/B,2CAA8B;AAC9B,2CAAgC;AAChC,4CAAiC;AACjC,4CAA4B;AAC5B,4CAAwC;AACxC,4CAAiC;AACjC,4CAA+B;AAC/B,4CAAiC;AACjC,4CAAqC;AACrC,4CAA2C;AAC3C,4CAAuC;AACvC,4CAAiC;AACjC,4CAAsC;AACtC,4CAAuC;AACvC,4CAAqC;AACrC,4CAAiC;AACjC,4CAAmC;AACnC,4CAAyC;AACzC,4CAAuC;AACvC,4CAAwC;AACxC,4CAA0C;AAC1C,4CAAsC;AACtC,4CAAuC;AACvC,4CAAkC;;;;;;;;;;;;;;;;ACtClC,MAAM,0BAAI,CAAA,GAAA,sBAAI,EAAE,MAAM,CAAC,CAAA,GAAA,gEAAK;AAE5B,SAAS,mCAAa,KAAK;IACzB,MAAM,aAAa,CAAA,GAAA,aAAK,EAAE;QACxB,UAAU;QACV,MAAM;IACR;IACA,OAAO,wBAAE,CAAA,GAAA,wBAAgB,GAAG;QAC1B,WAAW;QACX,SAAS,CAAA,GAAA,mBAAe;QACxB,SAAS,WAAW,OAAO;QAC3B,GAAG,KAAK;IACV;AACF;AAEA,SAAS,yCAAmB,KAAK;IAC/B,MAAM,aAAa,CAAA,GAAA,aAAK,EAAE;QACxB,oBAAoB;QACpB,kBAAkB;QAClB,mBAAmB;QACnB,iBAAiB;YACf,oBAAoB;QACtB;IACF;IACA,OAAO,wBAAE,CAAA,GAAA,wBAAgB,GAAG;QAC1B,SAAS,CAAA,GAAA,uBAAe;QACxB,SAAS,WAAW,OAAO;QAC3B,GAAG,KAAK;IACV;AACF;AAEO,SAAS,0CAAkB,YAAE,QAAQ,EAAE;IAC5C,MAAM,iBAAE,aAAa,EAAE,GAAG,CAAA,GAAA,mBAAW;IAErC,IAAI,CAAC,eACH,OAAO;IAGT,OAAO,wBAAE,oBAAoB;QAC3B,wBAAE;QACF,wBAAE,CAAA,GAAA,oBAAY,GAAG;YAAE,WAAW;QAAiB;QAC/C,wBAAE,CAAA,GAAA,qBAAa,GAAG;YAAE,WAAW;QAAkB;QACjD,wBAAE,CAAA,GAAA,mBAAW,GAAG;YAAE,WAAW;QAAgB;QAC7C,wBAAE,0CAAoB;YAAE,WAAW;QAAsB;QACzD,+DAA+D;QAC/D,wBAAE,CAAA,GAAA,yBAAiB,GAAG;YAAE,WAAW;QAAc;QACjD;KACD;AACH;;;;;AF7CA,MAAM,0BAAI,CAAA,GAAA,sBAAI,EAAE,MAAM,CAAC,CAAA,GAAA,gEAAK;AAIrB,MAAM,4CAAY,CAAC,QACxB,wBAAE,CAAA,GAAA,WAAG,GAAG;QAAE,GAAG,KAAK;QAAE,WAAW,CAAA,GAAA,iBAAS,EAAE,cAAc,MAAM,SAAS;IAAE;;UAO/D;;;GAAA,8CAAA;AAKZ,SAAS,wCAAkB,YACzB,QAAQ,aACR,SAAS,UACT,MAAM,gBACN,eAAe,mBACf,cAAc,uBACd,eAAe,oBACf,mBAAmB,mBACnB,cAAc,iBACd,SAAS,eACT,cAAc,wBAAE,CAAA,GAAA,yCAAgB,uBAChC,oBAAoB,wBACpB,mBAAmB,wBACnB,4CACA,cAAc,yBACd,oBAAoB,8BACpB,wBAAwB,OACxB,GAAG,MAkBJ;IACC,MAAM,mBAAmB,mBAAmB,eAAe;IAC3D,MAAM,oBAAoB,CAAA,GAAA,oBAAY,EAAE,kBAAkB;IAC1D,MAAM,mBAAmB,CAAA,GAAA,oBAAY,EAAE,kBAAkB;IAEzD;;;;;;;EAOA,GACA,MAAM,mBAAmB,CAAA,GAAA,iBAAS,EAChC,iBACA,WACA,CAAC,aAAa,EAAE,iBAAiB,CAAC,EAClC,CAAC,cAAc,EAAE,kBAAkB,KAAK,CAAC,CAAC,EAC1C,CAAC,YAAY,EAAE,kBAAkB,KAAK,CAAC,CAAC,EACxC,CAAC,aAAa,EAAE,iBAAiB,KAAK,CAAC,CAAC,EACxC,CAAC,WAAW,EAAE,iBAAiB,KAAK,CAAC,CAAC,EACtC;QACE,qBAAqB;QACrB,oBAAoB;QACpB,uBAAuB;QACvB,gBAAgB;IAClB;IAGF,MAAM,iBAAiB,wBAAE;QACvB,wBAAE,CAAA,GAAA,kBAAU,GAAG;YAAE,WAAW;QAAe;QAC3C,wBAAE;QACF;KACD;IAED,MAAM,iBAAiB,wBACrB,yCACA,kBACA;QACE,wBAAE,2BAA2B,MAAM;QACnC,wBAAE,EAAE,CAAC,gCAA+C;YAAC;SAAe;KACrE;IAGH,OAAO,wBAAE,2CAAoB;QAAE,WAAW;IAAiB,GAAG;QAC5D,wBAAE,gBAAgB;YAChB,wBAAE,cAAc;gBAAE,GAAG,IAAI;YAAC,GAAG;gBAC3B,wBAAE,oCAAc;4BAAE;oBAAQ,GAAG,iBAAiB;gBAAC,GAAG;oBAChD,wBAAE,EAAE,CAAC,kBAAkB,WAAW,EAAE;wBAAC;qBAAa;iBACnD;gBACD,aAAa;gBACb,YAAY;gBACZ,wBAAE,EAAE,CAAC,gCAA+C;oBAAC;iBAAe;gBACpE,wBAAE,EAAE,CAAC,6BACH,yBACA;aAEH;YACD,wBAAE,EAAE,CAAC,6BAA4C;gBAAC;aAAe;SAClE;QACD,wBAAE,cAAc,MAAM;KACvB;AACH;AAEA,SAAS,mCAAa,KAAwB;IAC5C,MAAM,iBAAE,aAAa,UAAE,MAAM,YAAE,QAAQ,EAAE,GAAG,MAAM,GAAG;IACrD,MAAM,SAAS,CAAA,GAAA,oBAAY,EAAE,MAAM;QAAE,kBAAkB;IAAc;IACrE,OAAO,wBAAE,qBAAqB,QAAQ;QACpC;QACA,wBAAE,4BAA4B,MAAM;QACpC,wBAAE;KACH;AACH;AAEA,MAAM,qCAAe,CAAC,YAAE,QAAQ,EAAE,GAChC,wBAAE,CAAA,GAAA,qBAAa,GAAG,wBAAE,CAAA,GAAA,wBAAgB,GAAG;AAElC,MAAM,4CAAmB,CAAC,QAC/B,wBAAE,oCAAc,wBAAE,yCAAmB;AAOhC,SAAS,0CAAmB,aAAE,SAAS,YAAE,QAAQ,EAAqB;IAC3E,MAAM,cAAc,CAAA,GAAA,qBAAa;IACjC,IAAI,eAAe,MAAM;QACvB,MAAM,gBAAE,YAAY,YAAE,QAAQ,eAAE,WAAW,EAAE,GAAG,CAAA,GAAA,kBAAU,EAAE;QAC5D,YAAY,CAAA,GAAA,iBAAS,EAAE,WAAW;YAChC,kBAAkB;YAClB,oBAAoB;YACpB,iBAAiB;QACnB;IACF;IAEA,OAAO,wBAAE,OAAO;mBAAE;IAAU,GAAG;AACjC,EAEA,qDAAqD;;;;;;;;;;;;;;;;;;;;;;AIrKrD,SAAS,qCAAe,IAAI,EAAE,SAAS;IACrC,OAAO;QACL,MAAM,KAAK,GAAG,CAAC,KAAK,IAAI,GAAG,UAAU,IAAI,EAAE;QAC3C,KAAK,KAAK,GAAG,CAAC,KAAK,GAAG,GAAG,UAAU,GAAG,EAAE;QACxC,OAAO,KAAK,GAAG,CAAC,UAAU,KAAK,GAAG,KAAK,KAAK,EAAE;QAC9C,QAAQ,KAAK,GAAG,CAAC,UAAU,MAAM,GAAG,KAAK,MAAM,EAAE;IACnD;AACF;AAEO,SAAS,0CAAc,GAAG,EAAE,SAAS;IAC1C,MAAM,OAAO,UAAU,OAAO,EAAE;IAChC,MAAM,YAAY,IAAI,OAAO,EAAE;IAC/B,IAAI,QAAQ,QAAQ,aAAa,MAAM;IACvC,OAAO,qCAAe,MAAM;AAC9B;AAEO,SAAS,0CAAa,MAAM,EAAE,SAAS,EAAE,cAAc;IAC5D,CAAA,GAAA,gBAAQ,EAAE;QACR,MAAM,MAAM,OAAO,OAAO;QAC1B,IAAI,OAAO,MAAM;QACjB,IAAI,kBAAkB,MAAM;YAC1B,UAAU,OAAO,EAAE;YACnB;QACF;QACA,MAAM,SAAS,UAAU,OAAO,IAAI,IAAI,CAAA,GAAA,aAAK;QAC7C,OAAO,SAAS,CAAC,gBAAgB,KAAK,CAAC;QACvC,UAAU,OAAO,GAAG;QACpB,OAAO,IAAM,OAAO,MAAM;IAC5B,GAAG;QAAC,OAAO,OAAO;QAAE;KAAe;AACrC;;;ADjBO,SAAS,0CAAiB,gBAAE,YAAY,EAAE;IAC/C,MAAM,SAAS,CAAA,GAAA,gBAAQ;IAEvB,MAAM,kBAAkB,CAAA,GAAA,aAAK,EAC3B,CAAA,GAAA,eAAO,EAAE;QACP,OAAO,OAAO,EAAE;IAClB,GAAG;IAGL,CAAA,GAAA,wBAAgB,EAAE;QAChB,KAAK;QACL,UAAU,gBAAgB,OAAO;IACnC;IAEA,OAAO;AACT;AAQO,SAAS,0CAAkB,gBAChC,YAAY,aACZ,SAAS,sBACT,kBAAkB,EACK;IACvB,MAAM,SAAS,CAAA,GAAA,gBAAQ;IAEvB,MAAM,CAAC,SAAS,WAAW,GAAG,CAAA,GAAA,eAAO,EACnC,CAAA,GAAA,yCAAY,EAAE,cAAc;IAG9B,MAAM,mBAAmB,CAAA,GAAA,kBAAU,EAAE;QACnC,MAAM,aAAa,CAAA,GAAA,yCAAY,EAAE,cAAc;QAC/C,WAAW;IACb,GAAG;QAAC,aAAa,OAAO;QAAE,UAAU,OAAO;KAAC;IAE5C,CAAA,GAAA,gBAAQ,EAAE;QACR,MAAM,MAAM,OAAO,OAAO;QAC1B,IAAI,OAAO,MAAM;QACjB,6BAA6B;QAC7B;IACF,GAAG;QAAC,OAAO,OAAO;KAAC;IAEnB,CAAA,GAAA,wBAAgB,EAAE;QAChB,KAAK;QACL,UAAS,EAAE;YACT;QACF;IACF;IAEA,2EAA2E;IAC3E,CAAA,GAAA,mBAAW,EAAE;QAAE,QAAQ;iBAAoB;IAAQ;IAEnD,OAAO;AACT;AAEO,SAAS,0CAAiB,cAAE,aAAa,MAAM;IACpD,MAAM,SAAS,CAAA,GAAA,gBAAQ;IACvB,MAAM,WAAW,CAAA,GAAA,qBAAa;IAE9B,MAAM,mBAAmB,CAAA,GAAA,kBAAU,EAAE;QACnC,MAAM,MAAM,OAAO,OAAO;QAC1B,IAAI,OAAO,MAAM;QACjB,MAAM,cAAc,CAAA,GAAA,qBAAa,EAAE;QACnC,SAAS;YAAE,MAAM;YAAa,SAAS;QAAY;QACnD,aAAa,aAAa;IAC5B,GAAG;QAAC,OAAO,OAAO;QAAE;QAAY;KAAS;IAEzC,CAAA,GAAA,gBAAQ,EAAE;QACR,qEAAqE;QACrE,uBAAuB;QACvB,MAAM,MAAM,OAAO,OAAO;QAC1B,IAAI,OAAO,MAAM;QACjB,oCAAoC;QACpC;QACA,MAAM,KAAK,CAAA,GAAA,eAAO,EAAE,kBAAkB;QACtC,IAAI,EAAE,CAAC,WAAW;QAClB,OAAO;YACL,KAAK,IAAI,WAAW;QACtB;IACF,GAAG;QAAC;KAAiB;IACrB,OAAO;AACT;AAEO,SAAS,0CAAmB,kBACjC,cAAc,gBACd,eAAe,iBACf,YAAY,oBACZ,YAAY,EACb;IACC,MAAM,SAAS,CAAA,GAAA,gBAAQ;IACvB,MAAM,aAAa,CAAA,GAAA,aAAK,EAAE;IAC1B,MAAM,WAAW,CAAA,GAAA,qBAAa;IAE9B,CAAA,GAAA,gBAAQ,EAAE;QACR,MAAM,MAAM,OAAO,OAAO;QAC1B,MAAM,eAAe,WAAW,OAAO;QACvC,IAAI,OAAO,MAAM;QAEjB,IAAI,iBAAiB;QAErB,MAAM,kBAAkB,CAAC;YACvB,IAAI,eAAe,QAAQ,CAAC,IAAI,QAAQ,KAAK,cAAc;YAC3D,IAAI,gBAAgB;YACpB,eAAe;YACf,SAAS;gBAAE,MAAM;gBAAe,SAAS;YAAK;YAC9C,WAAW,OAAO,GAAG;YACrB,iBAAiB;QACnB;QACA,MAAM,eAAe,CAAC;YACpB,IAAI,CAAC,cAAc;YACnB,SAAS;gBAAE,MAAM;gBAAe,SAAS;YAAM;YAC/C,WAAW,OAAO,GAAG;YACrB,YAAY;QACd;QACA,IAAI,EAAE,CAAC,qBAAqB;QAC5B,IAAI,EAAE,CAAC,QAAQ;QACf,OAAO;YACL,KAAK,IAAI,qBAAqB;YAC9B,KAAK,IAAI,QAAQ;QACnB;IACF,GAAG;QAAC;QAAgB,OAAO,OAAO;QAAE;KAAa;IACjD,OAAO;AACT;AAEO,SAAS,0CAAU,YAAE,QAAQ,eAAE,WAAW,gBAAE,eAAe,MAAM;IACtE,MAAM,SAAS,CAAA,GAAA,gBAAQ;IACvB,MAAM,YAAY,CAAA,GAAA,aAAK,EAAE;IAEzB,CAAA,GAAA,yCAAW,EAAE,QAAQ,WAAW;IAEhC,MAAM,iBAAiB,CAAA,GAAA,kBAAU,EAC/B,CAAC;QACC,YAAY,MAAM,MAAM,EAAE,OAAO,OAAO,OAAO;QAC/C,wDAAwD;QACxD,IAAI,cACF,OAAO,OAAO,EAAE,MAAM;YAAE,QAAQ,MAAM,MAAM;YAAE,UAAU;QAAI;IAEhE,GACA;QAAC,OAAO,OAAO;QAAE;KAAY;IAG/B,CAAA,GAAA,gBAAQ,EAAE;QACR,MAAM,MAAM,OAAO,OAAO;QAC1B,IAAI,OAAO,QAAQ,eAAe,MAChC,IAAI,EAAE,CAAC,SAAS;QAElB,OAAO;YACL,KAAK,IAAI,SAAS;QACpB;IACF,GAAG;QAAC,OAAO,OAAO;QAAE;KAAY;IAEhC,OAAO;AACT;;;;;;;;;;;;;;;AG3KA,6EAA6E;AAEtE,SAAS,0CACd,GAAG,EACH,YAAqB,EACrB,WAA0B,IAAI;IAE9B,IAAI,CAAC,IAAI,KAAK,EAAE,SAAS;QACvB,IAAI,IAAI,CAAC,cAAc;YACrB,0CAAgB,KAAK,cAAc;QACrC;QACA;IACF;IAEA,MAAM,uBAAuB,yCAAmB;IAChD,IAAI,cAAc,YAAY,wBAAwB;IAEtD,QAAQ,GAAG,CAAC,mCAAmC;IAE/C,gEAAgE;IAChE,MAAM,iBAAiB,IAAI,UAAU;IAErC,IAAI,CAAC,cAAc;QACjB,IAAI,kBAAkB,MAAM,IAAI,UAAU,CAAC;QAC3C;IACF;IACA,IAAI,kBAAkB,MAAM;IAE5B,gDAAgD;IAChD,IAAI,IAAI,SAAS,CAAC,gBAAgB,MAChC,IAAI,SAAS,CAAC,aAAa;QACzB,MAAM;QACN,KAAK;QACL,UAAU;QACV,SAAS;IACX;IAGF,gEAAgE;IAChE,IAAI,IAAI,QAAQ,CAAC,UAAU,MACzB,IAAI,QAAQ,CAAC;QACX,IAAI;QACJ,MAAM;QACN,OAAO;YACL,YAAY;YACZ,sBAAsB;gBAAC;gBAAK;aAAI;YAChC,gCAAgC;QAClC;IACF;IAGF,IAAI,UAAU,CAAC;QAAE,QAAQ;QAAa,cAAc;IAAE;IACtD,QAAQ,GAAG,CAAC,IAAI,UAAU;AAC5B;AAEA,SAAS,yCAAmB,GAAG;IAC7B,KAAK,MAAM,CAAC,KAAK,OAAO,IAAI,OAAO,OAAO,CAAC,IAAI,QAAQ,GAAG,OAAO,EAAG;QAClE,IAAI,OAAO,IAAI,IAAI,cACjB,OAAO;IAEX;IACA,OAAO;AACT;;;;;;ADrCA,MAAM,0BAAI,CAAA,GAAA,sBAAI,EAAE,MAAM,CAAC,CAAA,GAAA,gEAAK;AA2B5B,SAAS,2CAAqB,SAAS,EAAE,OAAyB,CAAC,CAAC;IAClE,MAAM,eAAE,WAAW,EAAE,GAAG,MAAM,GAAG;IACjC,QAAQ,GAAG,CAAC,8BAA8B;IAE1C,MAAM,MAAM,IAAI,CAAA,GAAA,eAAO,EAAE,GAAG,CAAC;mBAC3B;QACA,SAAS;QACT,sBAAsB;QACtB,cAAc;QACd,aAAa;QACb,WAAW;QACX,oBAAoB;QACpB,GAAG,IAAI;IACT;IAEA,2BAA2B;IAC3B,IAAI,eAAe,MACjB,CAAA,GAAA,qBAAa,EAAE,KAAK;IAGtB,mCAAmC;IACnC,OAAO;AACT;AAEA,MAAM,2CAAkC;IACtC,QAAQ;QACN,KAAK;QACL,KAAK;QACL,UAAU;IACZ;AACF;AAEO,SAAS,0CAAQ,KAAmB;IACzC,IAAI,mBAAE,eAAe,EAAE,GAAG;IAC1B,MAAM,iBACJ,gBAAgB,aAChB,KAAK,eACL,cAAc,yDACd,gBAAgB,sDAChB,QAAQ,eACR,WAAW,eACX,aAAa;IACb,WAAW,sBACX,kBAAkB,oBAClB,gBAAgB,cAChB,UAAU,eACV,cAAc,qBACd,gBAAgB,kBAChB,aAAa,MACb,GAAG,MACJ,GAAG;IACJ,IAAI,eACF,oBAAoB;IAGtB,MAAM,eAAe,eAAe;IAEpC,IAAI,gBAAgB,MAClB,CAAA,GAAA,eAAO,EAAE,WAAW,GAAG;IAGzB,MAAM,WAAW,CAAA,GAAA,qBAAa;IAC9B,IAAI,SAAS,CAAA,GAAA,gBAAQ;IACrB,MAAM,MAAM,CAAA,GAAA,aAAK;IACjB,MAAM,YAAY,CAAA,GAAA,aAAK;IAEvB,yCAAyC;IACzC,CAAA,GAAA,gBAAQ,EAAE;QACR,QAAQ,GAAG,CAAC,eAAe,OAAO,OAAO;IAC3C,GAAG;QAAC,OAAO,OAAO;KAAC;IAEnB,CAAA,GAAA,gBAAQ,EAAE;QACR,IAAI,SAAS,MAAM;QACnB,IAAI,OAAO,OAAO,IAAI,MAAM;YAC1B,QAAQ,GAAG,CAAC,iBAAiB;YAC7B,OAAO,OAAO,CAAC,QAAQ,CAAC;YACxB;QACF;QACA,MAAM,MAAM,cAAc,IAAI,OAAO,EAAE;mBACrC;wBACA;yBACA;YACA,GAAG,IAAI;QACT;QACA,IAAI,UAAU,CAAC,CAAA,GAAA,yCAAY,EAAE,KAAK,YAAY;YAAE,SAAS;QAAM;QAC/D,IAAI,EAAE,CAAC,cAAc;YACnB,gBAAgB;YAChB,SAAS;gBAAE,MAAM;gBAAoB,SAAS;YAAK;QACrD;QACA,cAAc;QACd,SAAS;YAAE,MAAM;YAAW,SAAS;QAAI;IAC3C,GAAG;QAAC;KAAM;IAEV,qBAAqB;IACrB,oBAAoB;IACpB,0DAA0D;IAC1D,sCAAsC;IACtC,+BAA+B;IAE/B,iCAAiC;IACjC,oBAAoB;IACpB,gCAAgC;IAChC,oDAAoD;IACpD,sCAAsC;IACtC,qBAAqB;IAErB,MAAM,uBAAuB,CAAA,GAAA,qBAAa;IAC1C,MAAM,YAAE,QAAQ,gBAAE,YAAY,EAAE,GAAG,CAAA,GAAA,kBAAU,EAAE;IAE/C,qBAAqB;IACrB,MAAM,cAAc,OAAO,OAAO,EAAE,iBAAiB,QAAQ;IAE7D,MAAM,YAAY,CAAA,GAAA,iBAAS,EACzB;QACE,cAAc,gBAAgB;QAC9B,mBAAmB,YAAY;IACjC,GACA,CAAC,EAAE,YAAY,WAAW,CAAC;IAG7B,OAAO,wBAAE,oCAAoC;QAAE,KAAK;IAAU,GAAG;QAC/D,wBAAE,sBAAsB;iBAAE;uBAAK;QAAU;QACzC,wBAAE,CAAA,GAAA,yCAAiB,GAAG;YACpB,gBAAgB;gBAAC;gBAAmB;aAAwB;QAC9D;QACA,wBAAE,CAAA,GAAA,yCAAe,GAAG;wBAAE;QAAW;QACjC,wBAAE,CAAA,GAAA,yCAAe,GAAG;YAAE,cAAc;QAAI;QACxC,wBAAE,CAAA,GAAA,yCAAgB,GAAG;YAAE,cAAc;uBAAK;gCAAW;QAAmB;QACxE,wBAAE,2CAAmB;sBAAE;6BAAU;QAAgB;QACjD;KACD;AACH;AAEO,SAAS,0CAAkB,YAChC,QAAQ,mBACR,eAAe,EAIhB;IACC,MAAM,SAAS,CAAA,GAAA,gBAAQ;IAEvB,CAAA,GAAA,gBAAQ,EAAE;QACR,MAAM,MAAM,OAAO,OAAO;QAC1B,IAAI,OAAO,MAAM;QACjB,CAAA,GAAA,yCAAc,EAAE,KAAK,UAAU;IACjC,GAAG;QAAC,OAAO,OAAO;QAAE;KAAS;IAC7B,OAAO;AACT;;;;;;;;;;;;;;;;;;AExMA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AAZA,4CAAkC;AAClC,4CAA8B;AAC9B,4CAAwB;AACxB,4CAA0B;AAC1B,4CAAuC;AACvC,4CAAmC;AACnC,2CAAkC;AAClC,4CAA8B;AAC9B,4CAAmC;AACnC,2CAAgC;AAChC,4CAAyB;AACzB,4CAAyB;AACzB,4CAAmC;;;;;;;;;ACN5B,SAAS,0CAAgB,QAC9B,IAAI,SACJ,QAAQ,OAIT;IACC,MAAM,gBAAgB,CAAA,GAAA,kBAAU,EAC9B,CAAC,KAAK;QACJ,MAAM,QAAQ,IAAI,QAAQ;QAC1B,IAAI,MAAM,MAAM,IAAI,MAAM;QAC1B,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,CAAC,IAAM,EAAE,EAAE,IAAI;QAClD,IAAI,OAAO,MACT,OAAO,IAAI,QAAQ,CAAC;QAEtB,MAAM,KAAE,CAAC,KAAE,CAAC,KAAE,CAAC,EAAE,GAAG;QACpB,MAAM,SAAS,CAAA,GAAA,oBAAY,EAAE;YAAC;YAAG;YAAG;SAAE;QACtC,MAAM,SAAS;YACb,MAAM;YACN,MAAM;QACR;QACA,MAAM,QAAQ;YACZ,IAAI;YACJ,MAAM;YACN,QAAQ;YACR,OAAO;gBACL,cAAc;gBACd,cAAc;YAChB;QACF;QACA,MAAM,OAAO,CAAC,cAAc,GAAG;QAC/B,MAAM,MAAM,CAAC,IAAI,CAAC;QAClB,IAAI,QAAQ,CAAC;IACf,GACA;QAAC;KAAM;IAET,MAAM,MAAM,CAAA,GAAA,gBAAQ;IACpB,CAAA,GAAA,6BAAqB,EAAE,KAAK,MAAM;IAClC,OAAO;AACT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AG7CA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AAjBA,4CAAkC;AAClC,4CAA0B;AAC1B,4CAAuC;AACvC,4CAAoC;AACpC,4CAAwC;AACxC,4CAA2C;AAC3C,4CAAiD;AACjD,4CAAuC;AACvC,4CAA4C;AAC5C,4CAA4C;AAC5C,4CAA8C;AAC9C,4CAAgD;AAChD,4CAA8C;AAC9C,4CAAuC;AACvC,4CAAoC;AACpC,4CAAmC;AACnC,4CAAkD;AAClD,4CAAgD;;;;;;ACdhD,MAAM,0BAAI,CAAA,GAAA,sBAAI,EAAE,MAAM,CAAC,CAAA,GAAA,gEAAK;AAErB,SAAS,0CAAa,KAAK;IAChC,MAAM,SAAE,KAAK,aAAE,YAAY,gBAAM,QAAQ,EAAE,GAAG,MAAM,GAAG;IACvD,OAAO,wBAAE,qBAAqB,MAAM;QAClC,wBACE,WACA;YACE,WAAW;QACb,GACA;QAEF;KACD;AACH;;;AFTA,MAAM,0BAAI,CAAA,GAAA,sBAAI,EAAE,MAAM,CAAC,CAAA,GAAA,gEAAK;AAE5B,SAAS,0CAAsB,KAAK;IAClC,MAAM,YAAE,QAAQ,YAAE,QAAQ,YAAE,QAAQ,aAAE,SAAS,SAAE,KAAK,kBAAE,cAAc,EAAE,GACtE;IACF,MAAM,OAAO,WAAW,eAAe;IACvC,OAAO,wBACL,CAAA,GAAA,yCAAW,GACX;QACE,WAAW,CAAA,GAAA,iBAAS,EAAE,0BAA0B;QAChD,SAAS;eACT;QACA,WAAW;IACb,GACA;QAAC;QAAU,wBAAE,CAAA,GAAA,WAAG,GAAG;kBAAE;QAAK;KAAG;AAEjC;AAEA,SAAS,yCAAmB,KAAK;IAC/B,IAAI,SACF,KAAK,kBACL,iBAAiB,gBACjB,QAAQ,YACR,QAAQ,YACR,QAAQ,YACR,WAAW,KAAO,kBAClB,gBAAgB,iBAChB,SAAS,EACV,GAAG;IACJ,MAAM,CAAC,QAAQ,QAAQ,GAAG,CAAA,GAAA,eAAO,EAAE,YAAY;IAE/C,MAAM,YAAY;QAChB;QACA,QAAQ,CAAC;IACX;IAEA,OAAO,wBACL,4BACA;QACE,WAAW,CAAA,GAAA,iBAAS,EAAE,WAAW;YAC/B,UAAU;YACV,WAAW,CAAC;QACd;IACF,GACA;QACE,wBACE,2CACA;YACE,UAAU;YACV,UAAU;mBACV;4BACA;QACF,GACA,wBAAE,oCAAoC;YACpC,wBAAE,gCAAgC;YAClC;YACA;SACD;QAEH,wBAAE,CAAA,GAAA,eAAO,GAAG;oBAAE;QAAO,GAAG,wBAAE,0BAA0B,MAAM;KAC3D;AAEL;AAEO,SAAS,0CAAiB,KAAK;IACpC,IAAI,SAAE,KAAK,YAAE,QAAQ,aAAE,SAAS,iBAAE,gBAAgB,MAAM,GAAG;IAC3D,OAAO,wBAAE,0BAA0B;mBAAE;IAAU,GAAG;QAChD,wBAAE,qBAAqB,MAAM,iBAAiB,wBAAE,MAAM;QACtD,wBAAE,qBAAqB,MAAM;KAC9B;AACH;AAEA,SAAS,0CAAe,KAAK;IAC3B,OAAO,wBAAE,0CAAoB;QAC3B,GAAG,KAAK;QACR,WAAW;IACb;AACF;AAEA,SAAS,0CAAkB,KAAK;IAC9B,OAAO,wBAAE,0CAAoB;QAC3B,GAAG,KAAK;QACR,WAAW;QACX,gBAAgB;IAClB;AACF;AAEA,SAAS,0CAAuB,KAAK;IACnC,IAAI,SAAE,KAAK,YAAE,QAAQ,SAAE,KAAK,iBAAE,aAAa,aAAE,SAAS,EAAE,GAAG;IAC3D,MAAM,CAAC,QAAQ,UAAU,GAAG,CAAA,GAAA,eAAO,EAAE;IACrC,kBAAkB,wBAAE;QAAC,wBAAE,aAAa;QAAQ;KAAM;IAClD,OAAO,wBAAE,0BAA0B;mBAAE;IAAU,GAAG;QAChD,wBAAE,+BAA+B;YAC/B,wBAAE,iCAAiC;YACnC,wBAAE,iCAAiC;gBACjC,wBAAE,CAAA,GAAA,aAAK,GAAG;oBACR,OAAO;oBACP,SAAS;oBACT,QAAQ;oBACR,SAAS,IAAM,UAAU,CAAC;oBAC1B,MAAM;gBACR;aACD;SACF;QACD,wBACE,CAAA,GAAA,eAAO,GACP;oBAAE;QAAO,GACT,wBAAE,mCAAmC,MAAM;KAE9C;AACH;AAEA,SAAS,0CAAc,SAAE,KAAK,aAAE,SAAS,YAAE,QAAQ,EAAE;IACnD,OAAO,wBAAE,sBAAsB;mBAAE;IAAU,GAAG;QAC5C,wBAAE,qCAAqC;QACvC,wBAAE,mCAAmC,MAAM;KAC5C;AACH;;;ADnHA,MAAM,0BAAI,CAAA,GAAA,sBAAI,EAAE,MAAM,CAAC,CAAA,GAAA,gEAAK;AAErB,SAAS,0CAAkB,QAAE,IAAI,EAAE,GAAG,MAAM;IACjD,OAAO,wBAAE,0BAA0B;QACjC,wBAAE,CAAA,GAAA,eAAO,GAAG;kBACV;YACA,UAAU;YACV,GAAG,IAAI;QACT;KACD;AACH;AAEO,SAAS,0CAAc,WAAE,OAAO,EAAE;IACvC,MAAM,QAAQ,QAAQ,UAAU;IAChC,OAAO,wBAAE,sBAAsB;QAC7B,wBAAE,EAAE,CAAC,OAAO,IAAI,CAAC,OAAO,MAAM,GAAG,GAAG,2CAAmB;YAAE,MAAM;QAAM;KACtE;AACH;AAEO,SAAS,0CAAwB,oBACtC,gBAAgB,eAChB,WAAW,UACX,SAAS,GAKV;IACC,MAAM,SAAS,CAAA,GAAA,gBAAQ;IACvB,MAAM,aAAE,SAAS,EAAE,GAAG,CAAA,GAAA,mBAAW;IACjC,MAAM,eAAe,CAAA,GAAA,kBAAU,EAAE;IAEjC,CAAA,GAAA,gBAAQ,EAAE;QACR,MAAM,MAAM,QAAQ;QACpB,IAAI,OAAO,MAAM;QACjB,IAAI,oBAAoB,MAAM;YAC5B,YAAY;YACZ;QACF;QAEA,8CAA8C;QAC9C,IAAI,oBAAoB,cAAc;QAEtC,MAAM,IAAI;QACV,MAAM,KAAK,IAAI,OAAO,CAAC;QAEvB,MAAM,OAAiD;YACrD;gBAAC,GAAG,CAAC,GAAG;gBAAG,GAAG,CAAC,GAAG;aAAE;YACpB;gBAAC,GAAG,CAAC,GAAG;gBAAG,GAAG,CAAC,GAAG;aAAE;SACrB;QACD,MAAM,WAAW,IAAI,qBAAqB,CAAC;QAC3C,YAAY;IACd,GAAG;QAAC,OAAO,OAAO;QAAE,cAAc;QAAS;QAAkB;KAAU;IAEvE,OAAO;AACT;AAEA,SAAS,oCAAc,WAAE,OAAO,EAAE;IAChC,OAAO,wBAAE,sBAAsB;QAC7B,wBAAE,MAAM;YACN,wBAAE,gCAAU;gBAAE,OAAO;gBAAU,OAAO,QAAQ,MAAM;YAAC;YACrD,wBAAE,gCAAU;gBAAE,OAAO;gBAAgB,OAAO,QAAQ,WAAW;YAAC;SACjE;KACF;AACH;AAEA,SAAS,+BAAS,SAAE,KAAK,SAAE,KAAK,EAAE;IAChC,OAAO,wBAAE,kBAAkB;QAAC,wBAAE,YAAY;QAAQ,wBAAE,cAAc;KAAO;AAC3E;AAEA,SAAS,6CAAuB,YAAE,QAAQ,YAAE,QAAQ,EAAE;IACpD,MAAM,MAAM,CAAA,GAAA,gBAAQ;IACpB,IAAI,KAAK,WAAW,MAAM,OAAO;IACjC,MAAM,CAAC,UAAU,YAAY,GAAG,CAAA,GAAA,eAAO,EAAE;IAEzC,MAAM,iBAAiB,SAAS,MAAM,CAAC,CAAC,IAAM,EAAE,MAAM,IAAI;IAE1D,CAAA,GAAA,gBAAQ,EAAE;QACR,IAAI,eAAe,MAAM,GAAG,GAAG;YAC7B,YAAY;YACZ;QACF;QAEA,MAAM,WAAW,IAAI,OAAO,CAAC,cAAc,CAAC;QAC5C,YAAY;QACZ,IAAI,CAAC,UACH,IAAI,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC;YAC9B,IAAI,EAAE,QAAQ,IAAI,UAChB,YAAY;QAEhB;IAEJ,GAAG;QAAC,IAAI,OAAO;QAAE;QAAU,eAAe,MAAM;KAAC;IAEjD,IAAI,CAAC,UAAU,OAAO,wBAAE,CAAA,GAAA,cAAM;IAC9B,OAAO,wBAAE,2CAAU;QAAE,UAAU;IAAe;AAChD;AAEO,SAAS,yCAAS,WAAE,OAAO,cAAE,UAAU,iBAAE,aAAa,EAAE;IAC7D,IAAI,WAAW,MAAM,OAAO;IAC5B,MAAM,OAAO,QAAQ,kBAAkB,CAAC,IAAI,CAAC,MAAM;IACnD,OAAO,wBAAE,iBAAiB;QACxB,wBAAE,MAAM;QACR,wBAAE,kBAAkB;YAClB,wBAAE,gCAAU;gBAAE,OAAO;gBAAK,OAAO,QAAQ,EAAE;YAAC;YAC5C,wBAAE,gCAAU;gBAAE,OAAO;gBAAK,OAAO,QAAQ,EAAE;YAAC;YAC5C,wBAAE,gCAAU;gBAAE,OAAO;gBAAK,OAAO,QAAQ,EAAE;YAAC;SAC7C;QACD,wBAAE;QACF,wBAAE,gCAAU;YAAE,OAAO;YAAQ,OAAO,iCAAW;QAAM;QACrD,wBAAE,CAAA,GAAA,aAAK,GAAG;YACR,OAAO;YACP,gBAAgB;YAChB,SAAS;YACT;gBACE,cAAc,CAAC;YACjB;QACF;KACD;AACH;AAEA,SAAS,iCAAW,IAAY;IAC9B,IAAI,OAAO,SACT,OAAO,wBAAE,kCAAY;QAAE,OAAO,OAAO;QAAS,MAAM;IAAK;IAC3D,IAAI,OAAO,MAAM,OAAO,wBAAE,kCAAY;QAAE,OAAO,OAAO;QAAM,MAAM;IAAK;IACvE,OAAO,CAAC,EAAE,KAAK,MAAM,CAAC;AACxB;AAEA,SAAS,iCAAW,SAAE,KAAK,QAAE,IAAI,aAAE,YAAY,GAAG;IAChD,OAAO,wBAAE,oBAAoB;QAC3B,wBAAE,eAAe,MAAM,OAAO,CAAC;QAC/B,wBAAE,aAAa;KAChB;AACH;AAEO,SAAS,0CAAa,YAC3B,QAAQ,iBACR,gBAAgB,0BAChB,qBAAqB,MACtB;IACC,IAAI,YAAY,MAAM,OAAO;IAE7B,IAAI,qBAAqB;IACzB,IAAI,mBAAmB;IACvB,IAAI,QAAQ;IAEZ,IAAI,iBAAiB,MAAM;QACzB,QAAQ;QACR,qBAAqB,wBACnB,CAAA,GAAA,yCAAa,GACb;YACE,OAAO;YACP,WAAW;YACX,UAAU;QACZ,GACA;YACE,wBAAE,8CAAwB;0BACxB;gBACA,UAAU;YACZ;SACD;QAEH,mBAAmB,SAAS,MAAM,CAAC,CAAC,IAAM,EAAE,MAAM,IAAI;IACxD;IAEA,OAAO,wBAAE,qBAAqB;QAC5B;QACA,wBACE,CAAA,GAAA,yCAAa,GACb;mBAAE;YAAO,WAAW;YAAoB,UAAU,iBAAiB;QAAK,GACxE;YACE,wBAAE,qCAAe;gBACf,UAAU;YACZ;SACD;KAEJ;AACH;AAEA,SAAS,oCAAc,YAAE,QAAQ,EAAE;IACjC,6CAA6C,GAC7C,IAAI,YAAY,MAAM,OAAO;IAE7B,MAAM,SAAS,CAAA,GAAA,YAAI,EAAE,UAAU,CAAC,IAAM,CAAC,EAAE,EAAE,MAAM,CAAC,GAAG,EAAE,EAAE,WAAW,CAAC,CAAC;IAEtE,OAAO,wBACL,sBACA,MAAM,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,KAAK,SAAS;QACrC,OAAO,wBAAE,qBAAqB;YAC5B,wBAAE,qCAAe;gBAAE,SAAS,QAAQ,CAAC,EAAE;YAAC;YACxC,wBAAE,2CAAU;0BAAE;YAAS;SACxB;IACH;AAEJ;AAEO,SAAS,0CAAS,YAAE,QAAQ,EAAE;IACnC,OAAO,wBACL,gBACA,SAAS,GAAG,CAAC,CAAC,SAAS,IAAM,wBAAE,2CAAe;YAAE,KAAK;qBAAG;QAAQ;AAEpE;;;AX9LO,MAAM,4CAAI,CAAA,GAAA,sBAAI,EAAE,MAAM,CAAC,CAAA,GAAA,gEAAK;AAE5B,SAAS,0CAAa,SAC3B,QAAQ,gCACR,gBAAgB,wBAChB,mBAAmB,mBACnB,cAAc,mBACd,cAAc,oBACd,eAAe,gBACf,QAAQ,SACR,KAAK,iBACL,gBAAgB,0BAChB,qBAAqB,mBACrB,cAAc,kBACd,aAAa,MAcd;IACC;;;;;EAKA,GAEA,MAAM,OAAO,CAAA,GAAA,kBAAU;IACvB,MAAM,YAAY,MAAM;IAExB,IAAI,eAAe,MACjB,CAAA,GAAA,eAAO,EAAE,WAAW,GAAG;IAGzB,UAAU,YACN,oCACA;IAEJ,MAAM,CAAC,QAAQ,QAAQ,GAAG,CAAA,GAAA,eAAO,EAAE;IAEnC,MAAM,CAAC,OAAO,SAAS,GAAG,CAAA,GAAA,qBAAa,EAAE,2BAA2B;QAClE,gBAAgB;QAChB,MAAM;IACR;IACA,MAAM,kBAAE,cAAc,QAAE,IAAI,EAAE,GAAG;IAEjC,MAAM,CAAC,aAAa,eAAe,GAAG,CAAA,GAAA,eAAO,EAAE;IAE/C,CAAA,GAAA,gBAAQ,EAAE;QACR,CAAA,GAAA,yCAAkB,EAAE,OAAO,cAAc;yBACvC;YACA,YAAY;kBACZ;QACF,GAAG,IAAI,CAAC;IACV,GAAG;QAAC;QAAO;QAAM;QAAa;QAAW;KAAa;IAEtD,MAAM,CAAC,iBAAiB,mBAAmB,GACzC,CAAA,GAAA,eAAO,EAA0B;IAEnC,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAA,GAAA,eAAO,EAAE;IAEjC,MAAM,mBAAmB,CAAA,GAAA,kBAAU,EAAE,CAAC;QACpC,mBAAmB;IACrB,GAAG,EAAE;IAEL,IAAI,gBAAgB;IACpB,IAAI,mBAAmB,MACrB,gBAAgB,0CACd,CAAA,GAAA,yCAAY,GACZ;QACE;YACE,mBAAmB;QACrB;QACA,UAAU;IACZ,GACA;QACE,0CAAE,CAAA,GAAA,wCAAO,GAAG;YACV,SAAS,MAAM,CAAC,EAAE,IAAI;YACtB,YAAY;YACZ;gBACE,SAAS;oBAAE,GAAG,KAAK;oBAAE,gBAAgB,CAAC;gBAAe;YACvD;QACF;QACA,0CAAE,CAAA,GAAA,yCAAW,GAAG;YAAE,UAAU;2BAAM;gCAAe;QAAmB;KACrE;IAIL,IAAI,OAAO;IACX,IAAI,kBAAkB,MAAM,CAAC,EAAE,IAAI,MAAM;QACvC,IAAI,IAAI,IAAI,CAAC,EAAE;QACf,OAAO;YAAE,GAAG,EAAE,EAAE;YAAE,GAAG,EAAE,EAAE;YAAE,GAAG,EAAE,EAAE;QAAC;IACrC;IAEA,OAAO,0CACL,CAAA,GAAA,yCAAe,GACf;QACE,QAAQ,0CAAE,CAAA,GAAA,yCAAa,GAAG;YACxB,iBAAiB,0CAAE,MAAM;YACzB,0CAAE,CAAA,GAAA,aAAK;YACP,0CAAE,CAAA,GAAA,yCAAe,GAAG;gBAClB,QAAQ;gBACR,SAAS,IAAM,QAAQ,CAAC;YAC1B;SACD;QACD,cAAc,0CAAE,CAAA,GAAA,yCAAQ,GAAG;YACzB,0CAAE,CAAA,GAAA,aAAK,GAAG;gBACR,SAAS;gBACT,OAAO;gBACP;oBACE,SAAS;wBAAE,GAAG,KAAK;wBAAE,MAAM,CAAC;oBAAK;gBACnC;YACF;YACA;SACD;QACD,aAAa;QACb,kBAAkB;qBAClB;IACF,GACA,0CACE,CAAA,GAAA,yCAAM,GACN;QACE,OAAO;0BACP;qBACA;QACA,YAAY;YAAE,MAAM;QAAQ;qBAC5B;IACF,GACA;QACE,0CAAE,CAAA,GAAA,yCAAsB,GAAG;YACzB,kBAAkB;YAClB,aAAa;QACf;QACA,0CAAE,CAAA,GAAA,yCAAQ,GAAG;YACX,UAAU;YACV,aAAa;QACf;QACA,0CAAE,CAAA,GAAA,yCAAc,GAAG;kBAAE;YAAM,OAAO,YAAY,UAAU;QAAQ;KACjE;AAGP;AAGO,MAAM,4CAAa;;;;;;;;;;","sources":["packages/map-interface/src/index.ts","packages/map-interface/src/context-panel/index.ts","packages/map-interface/src/context-panel/main.module.sass","packages/map-interface/src/location-panel/index.ts","packages/map-interface/src/location-panel/header.ts","packages/map-interface/src/location-panel/main.module.sass","packages/map-interface/src/location-info/index.ts","packages/map-interface/src/location-info/utils.ts","packages/map-interface/src/location-info/hash-string.ts","packages/map-interface/src/dev/index.ts","packages/map-interface/src/dev/map-page.ts","packages/map-interface/src/dev/xray.ts","packages/map-interface/src/container.ts","packages/map-interface/src/main.module.sass","packages/map-interface/src/controls.ts","packages/map-interface/src/helpers.ts","packages/map-interface/src/utils.ts","packages/map-interface/src/map-view/index.ts","packages/map-interface/src/map-view/terrain.ts","packages/map-interface/src/dev/main.module.sass","packages/map-interface/src/dev/tile-extent.ts","packages/map-interface/src/dev/vector-tile-features.ts","packages/map-interface/src/expansion-panel/index.ts","packages/map-interface/src/expansion-panel/main.module.sass","packages/map-interface/src/expansion-panel/headers.ts"],"sourcesContent":["export * from \"./context-panel\";\nexport * from \"./location-panel\";\nexport * from \"./dev\";\nexport * from \"./container\";\nexport * from \"./map-view\";\nexport * from \"./controls\";\nexport * from \"./helpers\";\nexport * from \"./utils\";\nexport * from \"./location-info\";\nexport * from \"./expansion-panel\";\n","import { useMemo } from \"react\";\nimport { Navbar, Button, InputGroup, Spinner, Card } from \"@blueprintjs/core\";\nimport hyper from \"@macrostrat/hyper\";\nimport styles from \"./main.module.sass\";\nimport { useMapStatus } from \"@macrostrat/mapbox-react\";\n\nconst h = hyper.styled(styles);\n\nconst spinnerElement = h(Spinner, { size: 16 });\n\nexport function LoadingButton({\n isLoading = false,\n onClick,\n active = false,\n icon = \"menu\",\n}) {\n return h(Button, {\n className: \"loading-button\",\n icon: isLoading ? spinnerElement : icon,\n large: false,\n minimal: true,\n onClick,\n active: active && !isLoading,\n });\n}\n\nexport function MapLoadingButton(props) {\n const { isLoading } = useMapStatus();\n const mapIsLoading = useMemo(() => isLoading, [isLoading]);\n return h(LoadingButton, { ...props, isLoading: mapIsLoading });\n}\n\ntype AnyChildren = React.ReactNode | React.ReactFragment;\n\nexport function FloatingNavbar({\n className,\n children,\n statusElement = null,\n}: {\n className?: string;\n children?: AnyChildren;\n statusElement?: AnyChildren;\n}) {\n return h(\"div.searchbar-holder\", { className }, [\n h(\"div.navbar-holder\", [\n h(Navbar, { className: \"searchbar panel\" }, children),\n ]),\n h.if(statusElement != null)(\n Card,\n { className: \"status-tongue\" },\n statusElement\n ),\n ]);\n}\n",".searchbar-holder\n transition: margin 300ms\n display: flex\n flex-direction: column\n margin: 0\n .navbar-holder\n display: flex\n flex-direction: row\n .searchbar\n width: 100%\n background-color: var(--panel-background-color)\n border-radius: 5px\n padding: 0 5px\n display: flex\n flex-direction: row\n align-items: center\n gap: 5px\n :global(.bp5-input-group)\n flex-grow: 1\n cursor: text\n\n:global(.bp5-navbar)>.loading-button\n width: 40px\n height: 40px\n\n.status-tongue\n background-color: var(--panel-background-color)\n margin: 5px\n margin-top: -12px\n padding: 0\n padding-top: 12px\n\n@media screen and (max-width: 768px)\n .status-tongue\n max-width: 100vw\n margin: 0\n border-radius: 0\n margin-top: -3px\n","import { Card } from \"@blueprintjs/core\";\nimport hyper from \"@macrostrat/hyper\";\nimport { InfoDrawerHeader, InfoDrawerHeaderProps } from \"./header\";\nimport classNames from \"classnames\";\nimport styles from \"./main.module.sass\";\nimport { ErrorBoundary } from \"@macrostrat/ui-components\";\n\nconst h = hyper.styled(styles);\n\nexport function InfoDrawerContainer(props) {\n const className = classNames(\"infodrawer\", props.className);\n return h(Card, { ...props, className });\n}\n\ninterface BaseInfoDrawerProps extends InfoDrawerHeaderProps {\n className?: string;\n title?: string;\n headerElement?: JSX.Element;\n children?: React.ReactNode;\n}\n\nexport function BaseInfoDrawer(props: BaseInfoDrawerProps) {\n const {\n className,\n headerElement = null,\n title,\n onClose,\n children,\n ...rest\n } = props;\n const header =\n headerElement ??\n h(InfoDrawerHeader, { onClose, ...rest }, [\n title == null ? null : h(\"h3\", [title]),\n ]);\n return h(InfoDrawerContainer, { className }, [\n header,\n h(\n \"div.infodrawer-body\",\n h(\"div.infodrawer-contents\", h(ErrorBoundary, null, children))\n ),\n ]);\n}\n\nexport function LocationPanel(props) {\n const { children, className, loading = false, ...rest } = props;\n const cls = classNames(\"location-panel\", className, { loading });\n return h(BaseInfoDrawer, { className: cls, ...rest }, children);\n}\n","import { Icon, Button } from \"@blueprintjs/core\";\nimport hyper from \"@macrostrat/hyper\";\nimport styles from \"./main.module.sass\";\nimport { useToaster } from \"@macrostrat/ui-components\";\nimport { LngLatCoords, Elevation } from \"../location-info\";\nimport {\n LocationFocusButton,\n useFocusState,\n isCentered,\n} from \"@macrostrat/mapbox-react\";\n\nconst h = hyper.styled(styles);\n\nfunction PositionButton({ position, showCopyLink = false }) {\n const focusState = useFocusState(position);\n\n const copyLinkIsVisible = isCentered(focusState) && showCopyLink;\n\n return h(\"div.position-controls\", [\n h(LocationFocusButton, { location: position, focusState }, []),\n h.if(copyLinkIsVisible)(CopyLinkButton, { itemName: \"position\" }),\n ]);\n}\n\nfunction CopyLinkButton({ itemName, children, onClick, ...rest }) {\n const toaster = useToaster();\n\n let message = `Copied link`;\n if (itemName != null) {\n message += ` to ${itemName}`;\n }\n message += \"!\";\n\n return h(\n Button,\n {\n className: \"copy-link-button\",\n rightIcon: h(Icon, { icon: \"link\", size: 12 }),\n minimal: true,\n small: true,\n onClick() {\n navigator.clipboard.writeText(window.location.href).then(\n () => {\n toaster?.show({\n message,\n intent: \"success\",\n icon: \"clipboard\",\n timeout: 1000,\n });\n onClick?.();\n },\n () => {\n toaster?.show({\n message: \"Failed to copy link\",\n intent: \"danger\",\n icon: \"error\",\n timeout: 1000,\n });\n }\n );\n },\n ...rest,\n },\n children ?? \"Copy link\"\n );\n}\n\nexport interface InfoDrawerHeaderProps {\n onClose: () => void;\n position: mapboxgl.LngLat;\n zoom?: number;\n elevation?: number;\n showCopyPositionButton?: boolean;\n}\n\nexport function InfoDrawerHeader(props: InfoDrawerHeaderProps) {\n const {\n onClose,\n position,\n zoom = 7,\n elevation,\n showCopyPositionButton,\n } = props;\n\n return h(\"header.location-panel-header\", [\n h(PositionButton, { position, showCopyLink: showCopyPositionButton }),\n h(\"div.spacer\"),\n h(LngLatCoords, {\n position,\n zoom,\n className: \"infodrawer-header-item\",\n }),\n h.if(elevation != null)(Elevation, {\n elevation,\n className: \"infodrawer-header-item\",\n }),\n h(Button, { minimal: true, icon: \"cross\", onClick: onClose }),\n ]);\n}\n",".copy-link-button:global(.bp5-minimal.bp5-button)\n color: var(--text-subtle-color)\n\n svg\n fill: var(--text-subtle-color)\n\n.location-panel-header\n padding: 5px\n display: flex\n flex-direction: row\n align-items: center\n gap: 1em\n border-bottom: 1px solid var(--panel-rule-color)\n\n .spacer\n flex-grow: 1\n\n .left-icon\n padding: 7px\n\n .position-controls :global(.bp5-button)\n font-size: 12px !important\n\n.infodrawer-header-item\n font-size: 12px\n\n :global(.secondary)\n font-size: 0.9em\n color: var(--text-subtle-color)\n\n.infodrawer\n pointer-events: all\n max-height: 100%\n max-width: 100%\n height: fit-content\n display: flex\n flex-direction: column\n overflow: hidden\n background-color: var(--panel-background-color)\n\n &:global(.bp5-card)\n padding: 0\n background-color: var(--panel-background-color)\n\n\n &.loading\n .infodrawer-body\n overflow-y: hidden\n min-height: 70px\n\n\n.infodrawer-contents\n padding: 0 1em 1em\n\n.infodrawer-body\n flex-shrink: 1\n min-height: 0\n transition: min-height 0.5s ease\n overflow-y: scroll\n position: relative\n\n// TODO: remove this when we have a better way to handle card media queries\n@media screen and (max-width: 768px)\n .infodrawer\n border-radius: var(--panel-border-radius, 0px)\n","import h from \"@macrostrat/hyper\";\nimport {\n formatCoordForZoomLevel,\n metersToFeet,\n normalizeLng,\n} from \"@macrostrat/mapbox-utils\";\nimport { formatValue } from \"./utils\";\n\nexport * from \"./hash-string\";\n\nexport function ValueWithUnit(props) {\n const { value, unit } = props;\n return h(\"span.value-with-unit\", [\n h(\"span.value\", [value]),\n h(\"span.spacer\", [\" \"]),\n h(\"span.unit\", [unit]),\n ]);\n}\n\nexport function DegreeCoord(props) {\n const { value, labels, precision = 3, format = formatValue } = props;\n const direction = value < 0 ? labels[1] : labels[0];\n\n return h(ValueWithUnit, {\n value: format(Math.abs(value), precision) + \"°\",\n unit: direction,\n });\n}\n\nexport interface LngLatProps {\n /** Map position */\n position: [number, number] | { lat: number; lng: number };\n className?: string;\n /** Zoom level (used to infer coordinate rounding if provided) */\n zoom?: number | null;\n /** Number of decimal places to round coordinates to */\n precision: number | null;\n /** Function to format coordinates */\n format?: (val: number, precision: number) => string;\n}\n\nexport function LngLatCoords(props: LngLatProps) {\n /** Formatted geographic coordinates */\n const { position, className, precision, zoom } = props;\n let { format } = props;\n if (position == null) {\n return null;\n }\n let lat, lng;\n if (Array.isArray(position)) {\n [lng, lat] = position;\n } else {\n ({ lat, lng } = position);\n }\n\n if (zoom != null && format == null && precision == null) {\n format = (val, _) => formatCoordForZoomLevel(val, zoom);\n }\n\n return h(\"div.lnglat-container\", { className }, [\n h(\"span.lnglat\", [\n h(DegreeCoord, {\n value: lat,\n labels: [\"N\", \"S\"],\n precision,\n format,\n }),\n \", \",\n h(DegreeCoord, {\n value: normalizeLng(lng),\n labels: [\"E\", \"W\"],\n precision,\n format,\n }),\n ]),\n ]);\n}\n\nexport function Elevation(props) {\n /** Renders an elevation value in meters and a parenthetical conversion to feet. */\n const { elevation, className, includeFeet = true } = props;\n if (elevation == null) return null;\n return h(\"div.elevation\", { className }, [\n h(ValueWithUnit, { value: elevation, unit: \"m\" }),\n h.if(includeFeet)(\"span.secondary\", [\n \" (\",\n h(ValueWithUnit, { value: metersToFeet(elevation), unit: \"ft\" }),\n \")\",\n ]),\n ]);\n}\n","import { format } from \"d3-format\";\n\nexport const fmt4 = format(\".4~f\");\nexport const fmt3 = format(\".3~f\");\nexport const fmt2 = format(\".2~f\");\nexport const fmt1 = format(\".1~f\");\nexport const fmtInt = format(\".0f\");\n\nexport function formatValue(val: number, precision: number = 0): string {\n switch (precision) {\n case 4:\n return fmt4(val);\n case 3:\n return fmt3(val);\n case 2:\n return fmt2(val);\n case 1:\n return fmt1(val);\n case 0:\n return fmtInt(val);\n default:\n return fmt4(val);\n }\n}\n","import {\n LatLng,\n MapPosition,\n formatCoordForZoomLevel,\n} from \"@macrostrat/mapbox-utils\";\nimport { ParsedQuery } from \"query-string\";\nimport { fmt1, fmt2, fmtInt } from \"./utils\";\n\ninterface LocationHashParams {\n x?: string;\n y?: string;\n z?: string;\n a?: string;\n e?: string;\n}\n\nexport function applyMapPositionToHash(\n args: LocationHashParams,\n mapPosition: MapPosition | null\n) {\n const pos = mapPosition?.camera;\n if (pos == null) return;\n const zoom = mapPosition.target?.zoom;\n\n args.x = formatCoordForZoomLevel(pos.lng, zoom);\n args.y = formatCoordForZoomLevel(pos.lat, zoom);\n\n if (pos.bearing == 0 && pos.pitch == 0 && zoom != null) {\n args.z = fmt1(zoom);\n } else if (pos.altitude != null) {\n if (pos.altitude > 5000) {\n args.z = fmt2(pos.altitude / 1000) + \"km\";\n } else {\n args.z = fmtInt(pos.altitude) + \"m\";\n }\n }\n if (pos.bearing != 0) {\n let az = pos.bearing;\n if (az < 0) az += 360;\n args.a = fmtInt(az);\n }\n if (pos.pitch != 0) {\n args.e = fmtInt(pos.pitch);\n }\n}\n\nfunction _fmt(x: string | number | string[]) {\n if (Array.isArray(x)) {\n x = x[0];\n }\n return parseFloat(x.toString());\n}\n\nexport function getMapPositionForHash(\n hashData: ParsedQuery<string>,\n centerPosition: LatLng | null\n): MapPosition {\n const {\n x = centerPosition?.lng ?? 0,\n y = centerPosition?.lat ?? 0,\n // Different default for zoom depending on whether we have a marker\n z = centerPosition != null ? 7 : 2,\n a = 0,\n e = 0,\n } = hashData;\n\n const lng = _fmt(x);\n const lat = _fmt(y);\n\n let altitude = null;\n let zoom = null;\n const _z = z.toString();\n if (_z.endsWith(\"km\")) {\n altitude = _fmt(_z.substring(0, _z.length - 2)) * 1000;\n } else if (_z.endsWith(\"m\")) {\n altitude = _fmt(_z.substring(0, _z.length - 1));\n } else {\n zoom = _fmt(z);\n }\n const bearing = _fmt(a);\n const pitch = _fmt(e);\n\n let target = undefined;\n if (bearing == 0 && pitch == 0 && zoom != null) {\n target = {\n lat,\n lng,\n zoom,\n };\n }\n\n return {\n camera: {\n lng: _fmt(x),\n lat: _fmt(y),\n altitude,\n bearing: _fmt(a),\n pitch: _fmt(e),\n },\n target,\n };\n}\n","export * from \"./map-page\";\nexport * from \"./tile-extent\";\nexport * from \"./vector-tile-features\";\nexport * from \"./xray\";\n","// Import other components\nimport { Switch } from \"@blueprintjs/core\";\nimport hyper from \"@macrostrat/hyper\";\nimport { Spacer, useDarkMode, useStoredState } from \"@macrostrat/ui-components\";\nimport mapboxgl from \"mapbox-gl\";\nimport { useCallback, useState, useEffect } from \"react\";\nimport { buildInspectorStyle, buildXRayStyle } from \"./xray\";\nimport { MapAreaContainer, PanelCard } from \"../container\";\nimport { FloatingNavbar, MapLoadingButton } from \"../context-panel\";\nimport { MapMarker } from \"../helpers\";\nimport { LocationPanel } from \"../location-panel\";\nimport { MapView } from \"../map-view\";\nimport styles from \"./main.module.sass\";\nimport { TileExtentLayer } from \"./tile-extent\";\nimport {\n FeaturePanel,\n FeatureSelectionHandler,\n TileInfo,\n} from \"./vector-tile-features\";\nimport { MapPosition } from \"@macrostrat/mapbox-utils\";\n\nexport const h = hyper.styled(styles);\n\nexport function MapInspector({\n title = \"Map inspector\",\n headerElement = null,\n transformRequest = null,\n mapPosition = null,\n mapboxToken = null,\n overlayStyle = null,\n children,\n style,\n focusedSource = null,\n focusedSourceTitle = null,\n fitViewport = true,\n projection = null,\n}: {\n headerElement?: React.ReactElement;\n transformRequest?: mapboxgl.TransformRequestFunction;\n title?: string;\n style?: mapboxgl.Style | string;\n children?: React.ReactNode;\n mapboxToken?: string;\n overlayStyle?: mapboxgl.Style | string;\n focusedSource?: string;\n focusedSourceTitle?: string;\n projection?: string;\n mapPosition?: MapPosition;\n fitViewport?: boolean;\n}) {\n /* We apply a custom style to the panel container when we are interacting\n with the search bar, so that we can block map interactions until search\n bar focus is lost.\n We also apply a custom style when the infodrawer is open so we can hide\n the search bar on mobile platforms\n */\n\n const dark = useDarkMode();\n const isEnabled = dark?.isEnabled;\n\n if (mapboxToken != null) {\n mapboxgl.accessToken = mapboxToken;\n }\n\n style ??= isEnabled\n ? \"mapbox://styles/mapbox/dark-v10\"\n : \"mapbox://styles/mapbox/light-v10\";\n\n const [isOpen, setOpen] = useState(false);\n\n const [state, setState] = useStoredState(\"macrostrat:dev-map-page\", {\n showTileExtent: false,\n xRay: false,\n });\n const { showTileExtent, xRay } = state;\n\n const [actualStyle, setActualStyle] = useState(style);\n\n useEffect(() => {\n buildInspectorStyle(style, overlayStyle, {\n mapboxToken,\n inDarkMode: isEnabled,\n xRay,\n }).then(setActualStyle);\n }, [style, xRay, mapboxToken, isEnabled, overlayStyle]);\n\n const [inspectPosition, setInspectPosition] =\n useState<mapboxgl.LngLat | null>(null);\n\n const [data, setData] = useState(null);\n\n const onSelectPosition = useCallback((position: mapboxgl.LngLat) => {\n setInspectPosition(position);\n }, []);\n\n let detailElement = null;\n if (inspectPosition != null) {\n detailElement = h(\n LocationPanel,\n {\n onClose() {\n setInspectPosition(null);\n },\n position: inspectPosition,\n },\n [\n h(TileInfo, {\n feature: data?.[0] ?? null,\n showExtent: showTileExtent,\n setShowExtent() {\n setState({ ...state, showTileExtent: !showTileExtent });\n },\n }),\n h(FeaturePanel, { features: data, focusedSource, focusedSourceTitle }),\n ]\n );\n }\n\n let tile = null;\n if (showTileExtent && data?.[0] != null) {\n let f = data[0];\n tile = { x: f._x, y: f._y, z: f._z };\n }\n\n return h(\n MapAreaContainer,\n {\n navbar: h(FloatingNavbar, [\n headerElement ?? h(\"h2\", title),\n h(Spacer),\n h(MapLoadingButton, {\n active: isOpen,\n onClick: () => setOpen(!isOpen),\n }),\n ]),\n contextPanel: h(PanelCard, [\n h(Switch, {\n checked: xRay,\n label: \"X-ray mode\",\n onChange() {\n setState({ ...state, xRay: !xRay });\n },\n }),\n children,\n ]),\n detailPanel: detailElement,\n contextPanelOpen: isOpen,\n fitViewport,\n },\n h(\n MapView,\n {\n style: actualStyle,\n transformRequest,\n mapPosition,\n projection: { name: \"globe\" },\n mapboxToken,\n },\n [\n h(FeatureSelectionHandler, {\n selectedLocation: inspectPosition,\n setFeatures: setData,\n }),\n h(MapMarker, {\n position: inspectPosition,\n setPosition: onSelectPosition,\n }),\n h(TileExtentLayer, { tile, color: isEnabled ? \"white\" : \"black\" }),\n ]\n )\n );\n}\n\n// Legacy export\nexport const DevMapPage = MapInspector;\n","import { getMapboxStyle, mergeStyles } from \"@macrostrat/mapbox-utils\";\nimport chroma from \"chroma-js\";\nimport mapboxgl from \"mapbox-gl\";\n\ninterface XRayOptions {\n color?: string;\n inDarkMode?: boolean;\n mapboxToken?: string;\n xRaySources?: string[];\n}\n\nexport async function buildXRayStyle(\n baseStyle: string | object,\n params: XRayOptions = null\n) {\n const {\n inDarkMode = false,\n color = \"rgb(74, 242, 161)\",\n mapboxToken,\n xRaySources\n } = params;\n const style = await getMapboxStyle(baseStyle, { access_token: mapboxToken });\n const sources = xRaySources ?? Object.keys(style.sources);\n\n let layers = [];\n for (let layer of style.layers) {\n if (!sources.includes(layer.source)) {\n layers.push(layer);\n continue;\n }\n let newLayer = transformMapboxLayer(layer, color, inDarkMode);\n if (newLayer != null) {\n layers.push(newLayer);\n }\n }\n\n return {\n ...style,\n layers,\n };\n}\n\nfunction transformMapboxLayer(layer, color, inDarkMode) {\n const c = chroma(color);\n const xRayColor = (opacity = 1, darken = 0) => {\n if (!inDarkMode) {\n return chroma(color)\n .darken(2 - darken)\n .alpha(opacity)\n .css();\n }\n return c.alpha(opacity).darken(darken).css();\n };\n\n if (layer.type == \"background\") {\n return null;\n }\n\n let newLayer = { ...layer };\n\n if (layer.type == \"fill\") {\n newLayer.paint = {\n \"fill-color\": xRayColor(0.1),\n \"fill-outline-color\": xRayColor(0.5),\n };\n } else if (layer.type == \"line\") {\n newLayer.paint = {\n \"line-color\": xRayColor(0.5, 0),\n \"line-width\": 1.5,\n };\n } else if (layer.type == \"symbol\") {\n newLayer.paint = {\n \"text-color\": xRayColor(1, -0.5),\n \"text-halo-color\": \"#000\",\n };\n } else if (layer.type == \"circle\") {\n newLayer.paint = {\n \"circle-color\": xRayColor(0.5, 0),\n \"circle-stroke-color\": xRayColor(0.5, 1),\n \"circle-radius\": 2,\n };\n }\n\n return newLayer;\n}\n\ntype InspectorStyleOptions = XRayOptions & {\n xRay?: boolean;\n};\n\nexport async function buildInspectorStyle(\n baseStyle: mapboxgl.Style | string,\n overlayStyle: mapboxgl.Style | string | null = null,\n params: InspectorStyleOptions = {}\n) {\n const { mapboxToken, xRay = false, xRaySources: _xRaySources, ...rest } = params;\n let xRaySources = _xRaySources;\n let style = await getMapboxStyle(baseStyle, {\n access_token: mapboxToken,\n });\n\n if (overlayStyle != null) {\n const overlay = await getMapboxStyle(overlayStyle, {\n access_token: mapboxToken,\n });\n style = mergeStyles(style, overlay);\n xRaySources ??= Object.keys(overlay.sources);\n }\n\n\n if (xRay) {\n // If we haven't specified sources, then we'll use all of them\n xRaySources ??= Object.keys(style.sources);\n\n style = await buildXRayStyle(style, { ...rest, mapboxToken, xRaySources });\n }\n return style;\n}\n","import hyper, { addClassNames } from \"@macrostrat/hyper\";\nimport { HTMLDivProps } from \"@blueprintjs/core\";\nimport styles from \"./main.module.sass\";\nimport classNames from \"classnames\";\nimport { useTransition } from \"transition-hook\";\nimport {\n MapboxMapProvider,\n ZoomControl,\n useMapPosition,\n} from \"@macrostrat/mapbox-react\";\nimport { ToasterContext } from \"@macrostrat/ui-components\";\nimport { MapBottomControls } from \"./controls\";\nimport { mapViewInfo, MapPosition } from \"@macrostrat/mapbox-utils\";\nimport { Card } from \"@blueprintjs/core\";\n\nimport { ReactNode } from \"react\";\n\nconst h = hyper.styled(styles);\n\ntype AnyElement = React.ReactNode | React.ReactElement | React.ReactFragment;\n\nexport const PanelCard = (props) =>\n h(Card, { ...props, className: classNames(\"panel-card\", props.className) });\n\ninterface ContextStackProps extends HTMLDivProps {\n adaptiveWidth: boolean;\n navbar: AnyElement;\n}\n\nexport enum DetailPanelStyle {\n FIXED = \"fixed\",\n FLOATING = \"floating\",\n}\n\nfunction _MapAreaContainer({\n children,\n className,\n navbar,\n contextPanel = null,\n detailPanel = null,\n detailPanelOpen,\n contextPanelOpen = true,\n bottomPanel = null,\n mainPanel,\n mapControls = h(MapBottomControls),\n contextStackProps = null,\n detailStackProps = null,\n detailPanelStyle = DetailPanelStyle.FLOATING,\n fitViewport = true,\n showPanelOutlines = false,\n preventMapInteraction = false,\n ...rest\n}: {\n navbar: AnyElement;\n children?: AnyElement;\n mapControls?: AnyElement;\n contextPanel?: AnyElement;\n contextStack?: AnyElement;\n mainPanel?: AnyElement;\n detailPanel?: AnyElement;\n bottomPanel?: AnyElement;\n className?: string;\n detailPanelOpen?: boolean;\n contextPanelOpen?: boolean;\n contextStackProps?: ContextStackProps;\n detailStackProps?: HTMLDivProps;\n detailPanelStyle: DetailPanelStyle;\n fitViewport?: boolean;\n showPanelOutlines?: boolean;\n}) {\n const _detailPanelOpen = detailPanelOpen ?? detailPanel != null;\n const contextPanelTrans = useTransition(contextPanelOpen, 800);\n const detailPanelTrans = useTransition(_detailPanelOpen, 800);\n\n /*- We apply a custom style to the panel container when we are interacting\n with the search bar, so that we can block map interactions until search\n bar focus is lost.\n - We also apply a custom style when the infodrawer is open so we can hide\n the search bar on mobile platforms\n - These styles are doubly applied so we can have both namespaced and\n outside-accessible styles for each case.\n */\n const mainUIClassNames = classNames(\n \"map-container\",\n className,\n `detail-panel-${detailPanelStyle}`,\n `context-panel-${contextPanelTrans.stage}`,\n `map-context-${contextPanelTrans.stage}`,\n `detail-panel-${detailPanelTrans.stage}`,\n `map-detail-${detailPanelTrans.stage}`,\n {\n \"detail-panel-open\": _detailPanelOpen,\n \"map-context-open\": contextPanelOpen,\n \"show-panel-outlines\": showPanelOutlines,\n \"fit-viewport\": fitViewport,\n }\n );\n\n const mapControlsExt = h([\n h(ZoomControl, { className: \"zoom-control\" }),\n h(\"div.spacer\"),\n mapControls,\n ]);\n\n const detailStackExt = h(\n \"div.detail-stack.infodrawer-container\",\n detailStackProps,\n [\n h(\"div.detail-panel-holder\", null, detailPanel),\n h.if(detailPanelStyle == DetailPanelStyle.FLOATING)([mapControlsExt]),\n ]\n );\n\n return h(MapStyledContainer, { className: mainUIClassNames }, [\n h(\"div.main-row\", [\n h(\"div.map-ui\", { ...rest }, [\n h(ContextStack, { navbar, ...contextStackProps }, [\n h.if(contextPanelTrans.shouldMount)([contextPanel]),\n ]),\n //h(MapView),\n children ?? mainPanel,\n h.if(detailPanelStyle == DetailPanelStyle.FLOATING)([detailStackExt]),\n h.if(detailPanelStyle == DetailPanelStyle.FIXED)(\n \"div.map-control-stack\",\n mapControlsExt\n ),\n ]),\n h.if(detailPanelStyle == DetailPanelStyle.FIXED)([detailStackExt]),\n ]),\n h(\"div.bottom\", null, bottomPanel),\n ]);\n}\n\nfunction ContextStack(props: ContextStackProps) {\n const { adaptiveWidth, navbar, children, ...rest } = props;\n const props1 = addClassNames(rest, { \"adaptive-width\": adaptiveWidth });\n return h(\"div.context-stack\", props1, [\n navbar,\n h(\"div.context-panel-holder\", null, children),\n h(\"div.spacer\"),\n ]);\n}\n\nconst MapProviders = ({ children }) =>\n h(ToasterContext, h(MapboxMapProvider, children));\n\nexport const MapAreaContainer = (props) =>\n h(MapProviders, h(_MapAreaContainer, props));\n\ninterface MapContainerProps {\n className?: string;\n children?: ReactNode;\n}\n\nexport function MapStyledContainer({ className, children }: MapContainerProps) {\n const mapPosition = useMapPosition();\n if (mapPosition != null) {\n const { mapIsRotated, mapUse3D, mapIsGlobal } = mapViewInfo(mapPosition);\n className = classNames(className, {\n \"map-is-rotated\": mapIsRotated,\n \"map-3d-available\": mapUse3D,\n \"map-is-global\": mapIsGlobal,\n });\n }\n\n return h(\"div\", { className }, children);\n}\n\n//const _MapPage = compose(HotkeysProvider, MapPage);\n",".map-container\n display: flex\n flex-direction: column\n position: relative\n width: 100%\n height: 100%\n overflow: hidden\n\n &.show-panel-outlines\n .map-view-container\n outline: 2px dotted dodgerblue\n\n &.fit-viewport\n height: 100vh\n width: 100vw\n /* mobile viewport bug fix */\n max-height: -webkit-fill-available\n\n // Compass display\n .compass-control\n display: none\n\n &.map-is-rotated\n .compass-control\n display: block\n\n .map-3d-control\n display: none\n\n &.map-3d-available .map-3d-control\n display: block\n\n &.map-is-rotated.map-3d-available .map-3d-control\n display: none\n\n .globe-control\n display: none\n\n svg\n color: var(--secondary-color)\n\n &.map-is-global .globe-control\n display: block\n\n &.detail-panel-open\n .zoom-control\n opacity: 0\n display: none\n\n &.detail-panel-fixed\n .detail-panel-holder\n & > *\n border-radius: unset\n\n.detail-panel-holder\n display: flex\n flex-direction: column\n min-height: 0\n\n & > *\n flex: 1\n\n.map-control-stack\n display: flex\n flex-direction: column\n width: 30em\n margin-left: -30em\n pointer-events: none\n\n.main-row\n flex: 1\n display: flex\n flex-direction: row\n position: relative\n max-height: 100%\n min-height: 0\n\n.map-ui\n flex: 1\n position: relative\n display: flex\n flex-direction: column\n max-height: 100%\n height: 100%\n box-shadow: 0 0 10px 4px var(--card-shadow-color)\n\n.map-view-container\n flex-grow: 1\n position: relative\n overflow: hidden\n\n.mapbox-map\n position: absolute\n top: 0\n bottom: 0\n left: 0\n right: 0\n\n &:global(.mapboxgl-map)\n // override the default mapbox position: relative in all cases\n position: absolute\n\n\n.panel-card\n padding: 10px\n background-color: var(--panel-background-color)\n overflow: hidden\n\n & > :last-child\n margin-bottom: 0\n\n:global(.bp5-dark) .panel-card\n background-color: var(--panel-background-color)\n\n.context-stack\n & > div\n flex-shrink: 1\n\n & > .searchbar\n flex: 0\n\n.context-stack,\n.detail-stack\n z-index: 10\n max-height: 100%\n\n.panel-container\n display: flex\n flex-direction: column\n\n & > div\n pointer-events: all\n\n.panel-title\n font-size: 16px\n\n.spacer\n flex-grow: 1\n pointer-events: none\n\n.map-view-container\n flex-grow: 1\n position: relative\n overflow: hidden\n\n.searchbar-holder\n margin-bottom: 0.5em\n\n.right-panel\n width: 24em\n\n.buttons\n display: flex\n flex-direction: row\n flex: 1\n min-width: 0\n\n.tab-button\n flex-shrink: 1\n min-width: 40px\n overflow: hidden\n text-align: right\n\n & :global(.bp5-button-text)\n transition: all 0.2s\n transition-delay: 0.1s\n\n .menu-card.narrow-card .panel-header:not(.minimal) &:global(.bp5-active) ~ & :global(.bp5-button-text)\n width: 0\n opacity: 0\n margin-left: -7px\n\n .context-panel-leave .menu-card .panel-header & :global(.bp5-button-text)\n opacity: 0\n width: 0\n\n.narrow-card.narrow-enter .panel-header .buttons\n margin-right: -500px\n\n.panel-header.minimal .tab-button:not(:hover):not(:global(.bp5-active))\n padding-left: 0\n padding-right: 0\n min-width: 30px\n width: 30px\n\n.panel-header.minimal .tab-button:not(:hover) :global(.bp5-button-text)\n width: 0\n opacity: 0\n margin-left: -7px\n\n.menu-group\n margin-bottom: 0.5em\n margin-top: 0.2em\n\n.menu-card :global .bp5-text ul,\n.menu-card :global .text-panel ul\n padding-left: 1em\n\n.menu-content\n display: flex\n flex-direction: column\n margin-bottom: -8px\n\n & .bp5-button-group\n margin-bottom: 4px\n\n & hr\n width: 100%\n\n:global\n .mapbox-map\n .mapbox-compass, .mapbox-3d\n display: none\n\n .mapboxgl-ctrl.mapbox-3d.mapbox-control\n width: unset\n\n .mapboxgl-ctrl.mapbox-3d.mapbox-control button\n width: unset\n padding-inline: 4px\n\n .mapboxgl-canvas-container\n width: 100%\n height: 100%\n\n .mapboxgl-ctrl.mapboxgl-ctrl-attrib\n background-color: var(--translucent-panel-background-color) !important\n\n .mapboxgl-ctrl.mapboxgl-ctrl-attrib a\n color: var(--text-color)\n\n .mapboxgl-marker svg path\n fill: var(--panel-background-color) !important\n\n .mapboxgl-marker svg circle\n fill: var(--secondary-color) !important\n\n .mapbox-control.mapbox-zoom\n background: var(--translucent-panel-background-inner)\n\n .mapbox-control.mapbox-zoom svg\n fill: var(--text-color) !important\n\n .mapboxgl-ctrl-logo\n transform: scale(0.9) translate(-8px, 2px)\n\n .bp5-dark\n .mapboxgl-ctrl-group\n background-color: var(--panel-background-color)\n\n .mapboxgl-ctrl-logo\n filter: invert(100%)\n\n .mapboxgl-ctrl-group button + button\n border-top: 1px solid var(--panel-rule-color) !important\n\n .bp5-dark .mapboxgl-ctrl-group .mapboxgl-ctrl-icon\n filter: invert(40%)\n\n .bp5-dark .mapboxgl-ctrl-group .mapboxgl-ctrl-icon:hover\n filter: invert(50%)\n\n .mapboxgl-ctrl-geolocate .mapboxgl-ctrl-icon\n filter: invert(40%)\n\n .mapboxgl-ctrl-geolocate .mapboxgl-ctrl-icon:hover\n filter: invert(50%)\n\n.detail-stack\n position: relative\n\n.detail-panel-container, .map-right-controls\n flex: 1\n\n\n.zoom-control\n transition: opacity 1s ease-in-out\n width: 30px\n position: absolute\n top: 0\n right: 0\n\n.map-controls\n display: flex\n flex-direction: row\n justify-content: right\n margin-bottom: 0\n gap: 0.5em\n\n :global(.map-control)\n & > :global(.bp5-button)\n padding: 0\n transform: translate(-3.5px, -3.5px)\n width: 22px !important\n\n\n.map-controls :global(.mapbox-control),\n.map-controls :global(.map-control-wrapper),\n.map-controls :global(.map-control)\n max-height: 22px\n height: 22px\n border-radius: 4px\n background-color: var(--panel-background-color)\n box-shadow: 0 0 0 1px var(--card-shadow-color)\n\n.map-controls :global(.mapbox-control) button,\n.map-controls :global(.map-control-wrapper) button,\n.map-controls :global(.map-control) button\n max-height: 22px\n height: 22px\n width: 22px\n max-width: 22px\n background-position: center center\n padding: 0\n//background-color: var(--panel-background-color)\n//color: var(--text-color)\n\n//.map-controls :global(.mapbox-control) button:hover,\n//.map-controls :global(.map-control-wrapper) button:hover,\n//.map-controls .map-control button:hover\n// background-color: var(--panel-background-color) !important\n\n.map-controls .map-scale-control\n background: none\n box-shadow: none\n padding-top: 8px\n\n :global(.mapboxgl-ctrl-scale)\n background-color: var(--translucent-panel-background-color)\n border-color: var(--secondary-text-color)\n color: var(--secondary-text-color)\n\n// .map-container.detail-panel-fixed\n// right: 30em\n\n/* For mobile phones, we want to make the most of screen space,\n which in some cases means adding complications to the basic page. */\n@media only screen and (max-width: 768px)\n .map-container.detail-panel-enter .context-stack\n height: 0\n visibility: hidden\n transition: height 0.5s ease-in-out\n\n .detail-stack\n height: fit-content\n position: inherit\n max-height: 70%\n\n .infodrawer-stack\n max-height: 70%\n\n &:global(.exit-active)\n max-height: 0\n\n :global(.mapbox-control.mapbox-zoom)\n display: none\n\n .map-controls\n position: absolute\n top: -60px\n right: 10px\n\n .detail-panel\n border-radius: 0px\n\n\n/* Desktop styling is necessarily much more complicated than mobile\n to handle a two-column layout. */\n@media screen and (min-width: 768px)\n /* Make map fill page rather than containing div,\n by unsetting map position */\n // We should move this to another file.\n .map-view-container\n position: unset\n\n\n .map-ui\n flex-direction: row\n padding: 1em 1em 2em\n min-height: 80px\n gap: 0.5em\n\n .context-stack\n max-width: var(--map-context-stack-max-width, 34em)\n min-width: 14em\n transition: width 300ms ease\n padding-bottom: 0.5em\n width: var(--map-context-stack-width, 16em)\n margin-right: 0.5em\n display: flex\n flex-direction: column\n\n &.adaptive-width\n width: var(--map-context-stack-width, none)\n max-width: var(--map-context-stack-max-width, none)\n transition: width 300ms ease\n\n :global(.bp5-navbar)\n //height: unset\n //padding: 5px\n h1, h2, h3\n margin: 0\n\n & > .spacer\n flex-grow: 0\n\n .context-panel-holder\n min-height: 0\n position: relative\n\n & > div\n max-height: 100%\n\n .detail-stack\n width: var(--map-detail-stack-width, 30em)\n display: flex\n flex-direction: column\n\n .context-stack, .detail-stack\n pointer-events: none\n z-index: 10\n\n & > div\n pointer-events: all\n margin-bottom: 0.5em\n\n &:last-child\n margin-bottom: 0\n\n &.spacer\n pointer-events: none\n\n .context-stack .spacer\n min-height: 1em\n\n /* Make map fill page rather than containing div,\n by unsetting map position */\n .map-view-container\n position: unset\n\n/** CSS Transitions **/\n\n.map-container\n // Context panel\n .context-panel-holder\n pointer-events: none\n flex: 1\n\n & > div\n pointer-events: all\n transition: opacity 0.8s ease\n //, height 0.8s ease, max-height 0.8s ease, padding 0.8s ease\n\n &.context-panel-from .context-panel-holder > div\n opacity: 0\n\n &.context-panel-enter .context-panel-holder > div\n opacity: 1\n\n &.context-panel-leave .context-panel-holder > div\n opacity: 0\n\n // Detail panel (floating)\n &.detail-panel-floating\n // We assume that the relevant panel is the first child of the stack.\n &.detail-panel-from .detail-panel-holder\n opacity: 0\n\n &.detail-panel-enter .detail-panel-holder\n opacity: 1\n\n &.detail-panel-leave .detail-panel-holder\n opacity: 0\n\n .detail-panel\n transition: opacity 0.8s ease, height 0.8s ease, max-height 0.8s ease\n\n // TODO: these styles have not been evaluated for mobile\n &.detail-panel-fixed\n .map-ui\n transition: margin-right 0.8s ease\n\n .detail-stack\n transition: margin-right 0.8s ease\n\n &.detail-panel-from .detail-panel-holder\n margin-right: calc(-1 * var(--map-detail-stack-width, 30em))\n\n &.detail-panel-enter .detail-panel-holder\n margin-right: 0\n\n &.detail-panel-leave .detail-panel-holder\n margin-right: calc(-1 * var(--map-detail-stack-width, 30em))\n\n\n// The max-height transition is a bit jerky because of panel padding.\n// We could probably fix this by pulling the panel container itself into\n// the class.\n//max-height: 0\n//padding: 0i\n\n@media only screen and (max-width: 768px)\n .map-container .detail-stack\n transition: opacity 0.8s ease, height 0.8s ease, max-height 0.8s ease\n\n .map-container.detail-panel-from .detail-stack\n max-height: 0\n height: 0\n\n .map-container.detail-panel-leave .detail-stack\n max-height: 0\n\n .map-container.context-panel-from .context-panel\n max-height: 0\n height: 0\n\n .map-container.context-panel-leave\n .context-stack\n .context-panel-holder\n flex: 0\n\n .spacer\n flex: 1\n\n// Shift UI around to center elements if we're in the global view \n@media only screen and (min-width: 768px)\n .map-container.detail-panel-leave .map-view-container\n margin-right: -14em\n\n .map-container.map-is-global.detail-panel-leave .map-view-container\n margin-right: -30em\n\n .map-container.map-is-global.context-panel-leave .map-view-container\n margin-left: -16em\n","import { useRef } from \"react\";\nimport { GeolocateControl } from \"mapbox-gl\";\nimport hyper from \"@macrostrat/hyper\";\nimport styles from \"./main.module.sass\";\nimport {\n CompassControl,\n GlobeControl,\n ThreeDControl,\n MapControlWrapper,\n useMapStatus,\n} from \"@macrostrat/mapbox-react\";\nimport { ScaleControl as BaseScaleControl } from \"mapbox-gl\";\nimport { DevToolsButtonSlot } from \"@macrostrat/ui-components\";\n\nconst h = hyper.styled(styles);\n\nfunction ScaleControl(props) {\n const optionsRef = useRef({\n maxWidth: 200,\n unit: \"metric\",\n });\n return h(MapControlWrapper, {\n className: \"map-scale-control\",\n control: BaseScaleControl,\n options: optionsRef.current,\n ...props,\n });\n}\n\nfunction GeolocationControl(props) {\n const optionsRef = useRef({\n showAccuracyCircle: true,\n showUserLocation: true,\n trackUserLocation: true,\n positionOptions: {\n enableHighAccuracy: true,\n },\n });\n return h(MapControlWrapper, {\n control: GeolocateControl,\n options: optionsRef.current,\n ...props,\n });\n}\n\nexport function MapBottomControls({ children }) {\n const { isInitialized } = useMapStatus();\n\n if (!isInitialized) {\n return null;\n }\n\n return h(\"div.map-controls\", [\n h(ScaleControl),\n h(ThreeDControl, { className: \"map-3d-control\" }),\n h(CompassControl, { className: \"compass-control\" }),\n h(GlobeControl, { className: \"globe-control\" }),\n h(GeolocationControl, { className: \"geolocation-control\" }),\n // If we have global development tools enabled, show the button\n h(DevToolsButtonSlot, { className: \"map-control\" }),\n children,\n ]);\n}\n","import {\n useMapRef,\n useMapEaseTo,\n useMapDispatch,\n useMapStatus,\n} from \"@macrostrat/mapbox-react\";\nimport { useRef } from \"react\";\nimport { debounce } from \"underscore\";\nimport useResizeObserver from \"use-resize-observer\";\n\nimport { getMapPosition } from \"@macrostrat/mapbox-utils\";\nimport mapboxgl from \"mapbox-gl\";\nimport { useCallback, useEffect, useState } from \"react\";\nimport { getMapPadding, useMapMarker } from \"./utils\";\n\nexport function MapResizeManager({ containerRef }) {\n const mapRef = useMapRef();\n\n const debouncedResize = useRef(\n debounce(() => {\n mapRef.current?.resize();\n }, 100)\n );\n\n useResizeObserver({\n ref: containerRef,\n onResize: debouncedResize.current,\n });\n\n return null;\n}\n\ninterface MapPaddingManagerProps {\n containerRef: React.RefObject<HTMLDivElement>;\n parentRef: React.RefObject<HTMLDivElement>;\n infoMarkerPosition: mapboxgl.LngLatLike;\n}\n\nexport function MapPaddingManager({\n containerRef,\n parentRef,\n infoMarkerPosition,\n}: MapPaddingManagerProps) {\n const mapRef = useMapRef();\n\n const [padding, setPadding] = useState(\n getMapPadding(containerRef, parentRef)\n );\n\n const updateMapPadding = useCallback(() => {\n const newPadding = getMapPadding(containerRef, parentRef);\n setPadding(newPadding);\n }, [containerRef.current, parentRef.current]);\n\n useEffect(() => {\n const map = mapRef.current;\n if (map == null) return;\n // Update map padding on load\n updateMapPadding();\n }, [mapRef.current]);\n\n useResizeObserver({\n ref: parentRef,\n onResize(sz) {\n updateMapPadding();\n },\n });\n\n // Ideally, we would not have to do this when we know the infobox is loaded\n useMapEaseTo({ center: infoMarkerPosition, padding });\n\n return null;\n}\n\nexport function MapMovedReporter({ onMapMoved = null }) {\n const mapRef = useMapRef();\n const dispatch = useMapDispatch();\n\n const mapMovedCallback = useCallback(() => {\n const map = mapRef.current;\n if (map == null) return;\n const mapPosition = getMapPosition(map);\n dispatch({ type: \"map-moved\", payload: mapPosition });\n onMapMoved?.(mapPosition, map);\n }, [mapRef.current, onMapMoved, dispatch]);\n\n useEffect(() => {\n // Get the current value of the map. Useful for gradually moving away\n // from class component\n const map = mapRef.current;\n if (map == null) return;\n // Update the URI when the map moves\n mapMovedCallback();\n const cb = debounce(mapMovedCallback, 100);\n map.on(\"moveend\", cb);\n return () => {\n map?.off(\"moveend\", cb);\n };\n }, [mapMovedCallback]);\n return null;\n}\n\nexport function MapLoadingReporter({\n ignoredSources,\n onMapLoading = null,\n onMapIdle = null,\n mapIsLoading,\n}) {\n const mapRef = useMapRef();\n const loadingRef = useRef(false);\n const dispatch = useMapDispatch();\n\n useEffect(() => {\n const map = mapRef.current;\n const mapIsLoading = loadingRef.current;\n if (map == null) return;\n\n let didSendLoading = false;\n\n const loadingCallback = (evt) => {\n if (ignoredSources.includes(evt.sourceId) || mapIsLoading) return;\n if (didSendLoading) return;\n onMapLoading?.(evt);\n dispatch({ type: \"set-loading\", payload: true });\n loadingRef.current = true;\n didSendLoading = true;\n };\n const idleCallback = (evt) => {\n if (!mapIsLoading) return;\n dispatch({ type: \"set-loading\", payload: false });\n loadingRef.current = false;\n onMapIdle?.(evt);\n };\n map.on(\"sourcedataloading\", loadingCallback);\n map.on(\"idle\", idleCallback);\n return () => {\n map?.off(\"sourcedataloading\", loadingCallback);\n map?.off(\"idle\", idleCallback);\n };\n }, [ignoredSources, mapRef.current, mapIsLoading]);\n return null;\n}\n\nexport function MapMarker({ position, setPosition, centerMarker = true }) {\n const mapRef = useMapRef();\n const markerRef = useRef(null);\n\n useMapMarker(mapRef, markerRef, position);\n\n const handleMapClick = useCallback(\n (event: mapboxgl.MapMouseEvent) => {\n setPosition(event.lngLat, event, mapRef.current);\n // We should integrate this with the \"easeToCenter\" hook\n if (centerMarker) {\n mapRef.current?.flyTo({ center: event.lngLat, duration: 800 });\n }\n }, // eslint-disable-next-line react-hooks/exhaustive-deps\n [mapRef.current, setPosition]\n );\n\n useEffect(() => {\n const map = mapRef.current;\n if (map != null && setPosition != null) {\n map.on(\"click\", handleMapClick);\n }\n return () => {\n map?.off(\"click\", handleMapClick);\n };\n }, [mapRef.current, setPosition]);\n\n return null;\n}\n","import { useEffect } from \"react\";\nimport { Marker } from \"mapbox-gl\";\n\nfunction calcMapPadding(rect, childRect) {\n return {\n left: Math.max(rect.left - childRect.left, 0),\n top: Math.max(rect.top - childRect.top, 0),\n right: Math.max(childRect.right - rect.right, 0),\n bottom: Math.max(childRect.bottom - rect.bottom, 0),\n };\n}\n\nexport function getMapPadding(ref, parentRef) {\n const rect = parentRef.current?.getBoundingClientRect();\n const childRect = ref.current?.getBoundingClientRect();\n if (rect == null || childRect == null) return;\n return calcMapPadding(rect, childRect);\n}\n\nexport function useMapMarker(mapRef, markerRef, markerPosition) {\n useEffect(() => {\n const map = mapRef.current;\n if (map == null) return;\n if (markerPosition == null) {\n markerRef.current?.remove();\n return;\n }\n const marker = markerRef.current ?? new Marker();\n marker.setLngLat(markerPosition).addTo(map);\n markerRef.current = marker;\n return () => marker.remove();\n }, [mapRef.current, markerPosition]);\n}\n","import hyper from \"@macrostrat/hyper\";\nimport {\n useMapRef,\n useMapDispatch,\n useMapPosition,\n} from \"@macrostrat/mapbox-react\";\nimport {\n mapViewInfo,\n MapPosition,\n setMapPosition,\n} from \"@macrostrat/mapbox-utils\";\nimport classNames from \"classnames\";\nimport mapboxgl from \"mapbox-gl\";\nimport { useEffect, useRef, useCallback } from \"react\";\nimport styles from \"../main.module.sass\";\nimport { enable3DTerrain } from \"./terrain\";\nimport {\n MapLoadingReporter,\n MapMovedReporter,\n MapPaddingManager,\n MapResizeManager,\n} from \"../helpers\";\nimport \"mapbox-gl/dist/mapbox-gl.css\";\nimport { getMapPadding } from \"../utils\";\n\nconst h = hyper.styled(styles);\n\ntype MapboxCoreOptions = Omit<mapboxgl.MapboxOptions, \"container\">;\n\nexport interface MapViewProps extends MapboxCoreOptions {\n showLineSymbols?: boolean;\n children?: React.ReactNode;\n mapboxToken?: string;\n // Deprecated\n accessToken?: string;\n terrainSourceID?: string;\n enableTerrain?: boolean;\n infoMarkerPosition?: mapboxgl.LngLatLike;\n mapPosition?: MapPosition;\n initializeMap?: (\n container: HTMLElement,\n args: MapboxOptionsExt\n ) => mapboxgl.Map;\n onMapLoaded?: (map: mapboxgl.Map) => void;\n onStyleLoaded?: (map: mapboxgl.Map) => void;\n onMapMoved?: (mapPosition: MapPosition, map: mapboxgl.Map) => void;\n}\n\nexport interface MapboxOptionsExt extends MapboxCoreOptions {\n mapPosition?: MapPosition;\n}\n\nfunction defaultInitializeMap(container, args: MapboxOptionsExt = {}) {\n const { mapPosition, ...rest } = args;\n console.log(\"Initializing map (default)\", args);\n\n const map = new mapboxgl.Map({\n container,\n maxZoom: 18,\n //maxTileCacheSize: 0,\n logoPosition: \"bottom-left\",\n trackResize: true,\n antialias: true,\n optimizeForTerrain: true,\n ...rest,\n });\n\n // set initial map position\n if (mapPosition != null) {\n setMapPosition(map, mapPosition);\n }\n\n //setMapPosition(map, mapPosition);\n return map;\n}\n\nconst defaultMapPosition: MapPosition = {\n camera: {\n lat: 34,\n lng: -120,\n altitude: 300000,\n },\n};\n\nexport function MapView(props: MapViewProps) {\n let { terrainSourceID } = props;\n const {\n enableTerrain = true,\n style,\n mapPosition = defaultMapPosition,\n initializeMap = defaultInitializeMap,\n children,\n mapboxToken,\n // Deprecated\n accessToken,\n infoMarkerPosition,\n transformRequest,\n projection,\n onMapLoaded = null,\n onStyleLoaded = null,\n onMapMoved = null,\n ...rest\n } = props;\n if (enableTerrain) {\n terrainSourceID ??= \"mapbox-3d-dem\";\n }\n\n const _mapboxToken = mapboxToken ?? accessToken;\n\n if (_mapboxToken != null) {\n mapboxgl.accessToken = _mapboxToken;\n }\n\n const dispatch = useMapDispatch();\n let mapRef = useMapRef();\n const ref = useRef<HTMLDivElement>();\n const parentRef = useRef<HTMLDivElement>();\n\n // Keep track of map position for reloads\n useEffect(() => {\n console.log(\"Map updated\", mapRef.current);\n }, [mapRef.current]);\n\n useEffect(() => {\n if (style == null) return;\n if (mapRef.current != null) {\n console.log(\"Setting style\", style);\n mapRef.current.setStyle(style);\n return;\n }\n const map = initializeMap(ref.current, {\n style,\n projection,\n mapPosition,\n ...rest,\n });\n map.setPadding(getMapPadding(ref, parentRef), { animate: false });\n map.on(\"style.load\", () => {\n onStyleLoaded?.(map);\n dispatch({ type: \"set-style-loaded\", payload: true });\n });\n onMapLoaded?.(map);\n dispatch({ type: \"set-map\", payload: map });\n }, [style]);\n\n // Map style updating\n // useEffect(() => {\n // if (mapRef?.current == null || style == null) return;\n // mapRef?.current?.setStyle(style);\n // }, [mapRef.current, style]);\n\n // Set map position if it changes\n // useEffect(() => {\n // const map = mapRef.current;\n // if (map == null || mapPosition == null) return;\n // setMapPosition(map, mapPosition);\n // }, [mapPosition]);\n\n const _computedMapPosition = useMapPosition();\n const { mapUse3D, mapIsRotated } = mapViewInfo(_computedMapPosition);\n\n // Get map projection\n const _projection = mapRef.current?.getProjection()?.name ?? \"mercator\";\n\n const className = classNames(\n {\n \"is-rotated\": mapIsRotated ?? false,\n \"is-3d-available\": mapUse3D ?? false,\n },\n `${_projection}-projection`\n );\n\n return h(\"div.map-view-container.main-view\", { ref: parentRef }, [\n h(\"div.mapbox-map#map\", { ref, className }),\n h(MapLoadingReporter, {\n ignoredSources: [\"elevationMarker\", \"crossSectionEndpoints\"],\n }),\n h(MapMovedReporter, { onMapMoved }),\n h(MapResizeManager, { containerRef: ref }),\n h(MapPaddingManager, { containerRef: ref, parentRef, infoMarkerPosition }),\n h(MapTerrainManager, { mapUse3D, terrainSourceID }),\n children,\n ]);\n}\n\nexport function MapTerrainManager({\n mapUse3D,\n terrainSourceID,\n}: {\n mapUse3D?: boolean;\n terrainSourceID?: string;\n}) {\n const mapRef = useMapRef();\n\n useEffect(() => {\n const map = mapRef.current;\n if (map == null) return;\n enable3DTerrain(map, mapUse3D, terrainSourceID);\n }, [mapRef.current, mapUse3D]);\n return null;\n}\n","// We should merge this with code in @macrostrat/mapbox-react/src/terrain.ts:\n\nexport function enable3DTerrain(\n map,\n shouldEnable: boolean,\n sourceID: string | null = null\n) {\n if (!map.style?._loaded) {\n map.once(\"style.load\", () => {\n enable3DTerrain(map, shouldEnable, sourceID);\n });\n return;\n }\n\n const currentTerrainSource = getTerrainSourceID(map);\n let demSourceID = sourceID ?? currentTerrainSource ?? \"mapbox-dem\";\n\n console.log(\"Enabling 3D terrain with source\", demSourceID);\n\n // Enable or disable terrain depending on our current desires...\n const currentTerrain = map.getTerrain();\n\n if (!shouldEnable) {\n if (currentTerrain != null) map.setTerrain(null);\n return;\n }\n if (currentTerrain != null) return;\n\n // Add a DEM source if one is not found already.\n if (map.getSource(demSourceID) == null) {\n map.addSource(demSourceID, {\n type: \"raster-dem\",\n url: \"mapbox://mapbox.mapbox-terrain-dem-v1\",\n tileSize: 512,\n maxzoom: 14,\n });\n }\n\n // add a sky layer that will show when the map is highly pitched\n if (map.getLayer(\"sky\") == null) {\n map.addLayer({\n id: \"sky\",\n type: \"sky\",\n paint: {\n \"sky-type\": \"atmosphere\",\n \"sky-atmosphere-sun\": [0.0, 0.0],\n \"sky-atmosphere-sun-intensity\": 15,\n },\n });\n }\n\n map.setTerrain({ source: demSourceID, exaggeration: 1 });\n console.log(map.getTerrain());\n}\n\nfunction getTerrainSourceID(map) {\n for (const [key, source] of Object.entries(map.getStyle().sources)) {\n if (source.type == \"raster-dem\") {\n return key;\n }\n }\n return null;\n}\n",".feature-panel\n position: relative\n margin: 0 -1em\n\n.key-value\n display: inline-block\n margin-right: 1em\n .key\n font-weight: bold\n font-size: 0.9em\n &:after\n content: ': '\n .value\n font-size: 0.9em\n\n.feature-properties\n position: relative\n &:before\n content: \"–\"\n position: absolute\n top: 4px\n left: 0\n\n.feature-header h3\n margin-bottom: 0\n margin-top: 0.5em\n\n.feature-group\n border-bottom: 1px solid var(--panel-rule-inner)\n margin-bottom: 0.5em\n &:last-child\n border-bottom: none\n\n.tile-info\n display: flex\n flex-direction: row\n align-items: baseline\n h3\n margin-right: 0.5em\n\n.opacity-slider\n margin: 0 1em 0.5em\n :global\n .bp5-slider-handle .bp5-slider-label\n background-color: var(--secondary-color)\n color: var(--text-color)\n\n.unit-number\n .unit\n font-size: 0.9em\n margin-left: 0.2em\n font-weight: bold\n\n.page\n margin: 2em auto\n max-width: 50em\n\n.dev-index-page\n overflow-y: scroll\n","import { useMapConditionalStyle, useMapRef } from \"@macrostrat/mapbox-react\";\nimport { tileToGeoJSON } from \"@mapbox/tilebelt\";\nimport { useCallback } from \"react\";\n\ntype TileIndex = { x: number; y: number; z: number };\n\nexport function TileExtentLayer({\n tile,\n color = \"red\",\n}: {\n tile: TileIndex | null;\n color?: string;\n}) {\n const styleCallback = useCallback(\n (map, val: TileIndex) => {\n const style = map.getStyle();\n if (style.layers == null) return;\n style.layers = style.layers.filter((l) => l.id != \"tile-extent\");\n if (val == null) {\n return map.setStyle(style);\n }\n const { x, y, z } = val;\n const extent = tileToGeoJSON([x, y, z]);\n const source = {\n type: \"geojson\",\n data: extent,\n };\n const layer = {\n id: \"tile-extent\",\n type: \"line\",\n source: \"tile-extent\",\n paint: {\n \"line-color\": color,\n \"line-width\": 2,\n },\n };\n style.sources[\"tile-extent\"] = source;\n style.layers.push(layer);\n map.setStyle(style);\n },\n [color]\n );\n const map = useMapRef();\n useMapConditionalStyle(map, tile, styleCallback);\n return null;\n}\n","import { Spinner, Switch } from \"@blueprintjs/core\";\nimport { useMapRef, useMapStatus } from \"@macrostrat/mapbox-react\";\nimport mapboxgl from \"mapbox-gl\";\nimport hyper from \"@macrostrat/hyper\";\nimport styles from \"./main.module.sass\";\nimport { useEffect, useState } from \"react\";\nimport { JSONView, usePrevious } from \"@macrostrat/ui-components\";\nimport { group } from \"d3-array\";\nimport { ExpansionPanel } from \"../expansion-panel\";\n\nconst h = hyper.styled(styles);\n\nexport function FeatureProperties({ data, ...rest }) {\n return h(\"div.feature-properties\", [\n h(JSONView, {\n data,\n hideRoot: true,\n ...rest,\n }),\n ]);\n}\n\nexport function FeatureRecord({ feature }) {\n const props = feature.properties;\n return h(\"div.feature-record\", [\n h.if(Object.keys(props).length > 0)(FeatureProperties, { data: props }),\n ]);\n}\n\nexport function FeatureSelectionHandler({\n selectedLocation,\n setFeatures,\n radius = 2,\n}: {\n selectedLocation: mapboxgl.LngLat;\n setFeatures: (features: mapboxgl.MapboxGeoJSONFeature[]) => void;\n radius?: number;\n}) {\n const mapRef = useMapRef();\n const { isLoading } = useMapStatus();\n const prevLocation = usePrevious(selectedLocation);\n\n useEffect(() => {\n const map = mapRef?.current;\n if (map == null) return;\n if (selectedLocation == null) {\n setFeatures(null);\n return;\n }\n\n // Don't update if the location hasn't changed\n if (selectedLocation == prevLocation) return;\n\n const r = radius;\n const pt = map.project(selectedLocation);\n\n const bbox: [mapboxgl.PointLike, mapboxgl.PointLike] = [\n [pt.x - r, pt.y - r],\n [pt.x + r, pt.y + r],\n ];\n const features = map.queryRenderedFeatures(bbox);\n setFeatures(features);\n }, [mapRef.current, prevLocation?.current, selectedLocation, isLoading]);\n\n return null;\n}\n\nfunction FeatureHeader({ feature }) {\n return h(\"div.feature-header\", [\n h(\"h3\", [\n h(KeyValue, { label: \"Source\", value: feature.source }),\n h(KeyValue, { label: \"Source layer\", value: feature.sourceLayer }),\n ]),\n ]);\n}\n\nfunction KeyValue({ label, value }) {\n return h(\"span.key-value\", [h(\"span.key\", label), h(\"code.value\", value)]);\n}\n\nfunction LoadingAwareFeatureSet({ features, sourceID }) {\n const map = useMapRef();\n if (map?.current == null) return null;\n const [isLoaded, setIsLoaded] = useState(false);\n\n const sourceFeatures = features.filter((d) => d.source == \"burwell\");\n\n useEffect(() => {\n if (sourceFeatures.length > 0) {\n setIsLoaded(true);\n return;\n }\n\n const isLoaded = map.current.isSourceLoaded(sourceID);\n setIsLoaded(isLoaded);\n if (!isLoaded) {\n map.current.once(\"sourcedata\", (e) => {\n if (e.sourceId == sourceID) {\n setIsLoaded(true);\n }\n });\n }\n }, [map.current, sourceID, sourceFeatures.length]);\n\n if (!isLoaded) return h(Spinner);\n return h(Features, { features: sourceFeatures });\n}\n\nexport function TileInfo({ feature, showExtent, setShowExtent }) {\n if (feature == null) return null;\n const size = feature._vectorTileFeature._pbf.length;\n return h(\"div.tile-info\", [\n h(\"h3\", \"Tile\"),\n h(\"div.tile-index\", [\n h(KeyValue, { label: \"x\", value: feature._x }),\n h(KeyValue, { label: \"y\", value: feature._y }),\n h(KeyValue, { label: \"z\", value: feature._z }),\n ]),\n h(\"div.spacer\"),\n h(KeyValue, { label: \"Size\", value: formatSize(size) }),\n h(Switch, {\n label: \"Show extent\",\n alignIndicator: \"right\",\n checked: showExtent,\n onChange() {\n setShowExtent(!showExtent);\n },\n }),\n ]);\n}\n\nfunction formatSize(size: number) {\n if (size > 1000000)\n return h(UnitNumber, { value: size / 1000000, unit: \"Mb\" });\n if (size > 1000) return h(UnitNumber, { value: size / 1000, unit: \"Kb\" });\n return `${size} bytes`;\n}\n\nfunction UnitNumber({ value, unit, precision = 1 }) {\n return h(\"span.unit-number\", [\n h(\"span.number\", value.toFixed(precision)),\n h(\"span.unit\", unit),\n ]);\n}\n\nexport function FeaturePanel({\n features,\n focusedSource = null,\n focusedSourceTitle = null,\n}) {\n if (features == null) return null;\n\n let focusedSourcePanel = null;\n let filteredFeatures = features;\n let title = \"Features\";\n\n if (focusedSource != null) {\n title = \"Basemap features\";\n focusedSourcePanel = h(\n ExpansionPanel,\n {\n title: \"Macrostrat features\",\n className: \"macrostrat-features\",\n expanded: true,\n },\n [\n h(LoadingAwareFeatureSet, {\n features,\n sourceID: focusedSource,\n }),\n ]\n );\n filteredFeatures = features.filter((d) => d.source != focusedSource);\n }\n\n return h(\"div.feature-panel\", [\n focusedSourcePanel,\n h(\n ExpansionPanel,\n { title, className: \"basemap-features\", expanded: focusedSource == null },\n [\n h(FeatureGroups, {\n features: filteredFeatures,\n }),\n ]\n ),\n ]);\n}\n\nfunction FeatureGroups({ features }) {\n /** Group features by source and sourceLayer */\n if (features == null) return null;\n\n const groups = group(features, (d) => `${d.source} - ${d.sourceLayer}`);\n\n return h(\n \"div.feature-groups\",\n Array.from(groups).map(([key, features]) => {\n return h(\"div.feature-group\", [\n h(FeatureHeader, { feature: features[0] }),\n h(Features, { features }),\n ]);\n })\n );\n}\n\nexport function Features({ features }) {\n return h(\n \"div.features\",\n features.map((feature, i) => h(FeatureRecord, { key: i, feature }))\n );\n}\n","import { useState } from \"react\";\nimport { Collapse, Icon } from \"@blueprintjs/core\";\nimport hyper from \"@macrostrat/hyper\";\nimport styles from \"./main.module.sass\";\nimport classNames from \"classnames\";\nimport { Button } from \"@blueprintjs/core\";\nimport { PanelSubhead } from \"./headers\";\n\nconst h = hyper.styled(styles);\n\nfunction ExpansionPanelSummary(props) {\n const { expanded, children, onChange, className, title, titleComponent } =\n props;\n const icon = expanded ? \"chevron-up\" : \"chevron-down\";\n return h(\n PanelSubhead,\n {\n className: classNames(\"expansion-panel-header\", className),\n onClick: onChange,\n title,\n component: titleComponent,\n },\n [children, h(Icon, { icon })]\n );\n}\n\nfunction ExpansionPanelBase(props) {\n let {\n title,\n titleComponent = \"h3\",\n children,\n expanded,\n helpText,\n onChange = () => {},\n sideComponent = null,\n className,\n } = props;\n const [isOpen, setOpen] = useState(expanded || false);\n\n const onChange_ = () => {\n onChange();\n setOpen(!isOpen);\n };\n\n return h(\n \"div.expansion-panel-base\",\n {\n className: classNames(className, {\n expanded: isOpen,\n collapsed: !isOpen,\n }),\n },\n [\n h(\n ExpansionPanelSummary,\n {\n onChange: onChange_,\n expanded: isOpen,\n title,\n titleComponent,\n },\n h(\"div.expansion-summary-title-help\", [\n h(\"span.expansion-panel-subtext\", helpText),\n \" \",\n sideComponent,\n ])\n ),\n h(Collapse, { isOpen }, h(\"div.expansion-children\", null, children)),\n ]\n );\n}\n\nexport function InfoPanelSection(props) {\n let { title, children, className, headerElement = null } = props;\n return h(\"div.info-panel-section\", { className }, [\n h(\"div.panel-subhead\", null, headerElement ?? h(\"h3\", title)),\n h(\"div.panel-content\", null, children),\n ]);\n}\n\nfunction ExpansionPanel(props) {\n return h(ExpansionPanelBase, {\n ...props,\n className: \"expansion-panel\",\n });\n}\n\nfunction SubExpansionPanel(props) {\n return h(ExpansionPanelBase, {\n ...props,\n className: \"expansion-panel sub-expansion-panel\",\n titleComponent: \"h4\",\n });\n}\n\nfunction ExpandableDetailsPanel(props) {\n let { title, children, value, headerElement, className } = props;\n const [isOpen, setIsOpen] = useState(false);\n headerElement ??= h([h(\"div.title\", title), value]);\n return h(\"div.expandable-details\", { className }, [\n h(\"div.expandable-details-main\", [\n h(\"div.expandable-details-header\", headerElement),\n h(\"div.expandable-details-toggle\", [\n h(Button, {\n small: true,\n minimal: true,\n active: isOpen,\n onClick: () => setIsOpen(!isOpen),\n icon: \"more\",\n }),\n ]),\n ]),\n h(\n Collapse,\n { isOpen },\n h(\"div.expandable-details-children\", null, children)\n ),\n ]);\n}\n\nfunction ExpansionBody({ title, className, children }) {\n return h(\"div.expansion-body\", { className }, [\n h(\"div.expansion-panel-detail-header\", title),\n h(\"div.expansion-panel-detail-body\", null, children),\n ]);\n}\n\nexport {\n ExpansionPanel,\n ExpansionPanelSummary,\n ExpandableDetailsPanel,\n SubExpansionPanel,\n ExpansionBody,\n PanelSubhead,\n};\n","\n.panel-subhead\n padding: 0.2em var(--box-horizontal-padding)\n border-top: 1px solid var(--panel-rule-color)\n border-bottom: 1px solid var(--panel-rule-color)\n background-color: var(--accent-color)\n display: flex\n flex-direction: row\n align-items: center\n z-index: 1\n gap: var(--box-horizontal-padding)\n top: -1px\n position: sticky\n h1, h2, h3, h4\n font-family: Montserrat,sans-serif\n font-weight: 700\n margin: 0.2em 0\n h4\n font-weight: 600\n .title\n flex-grow: 1\n\n// :global(.bp5-dark) .panel-subhead\n// margin 0 1px\n\n.info-panel-section\n &>.panel-subhead\n margin: -1px calc(var(--panel-padding-h) * -1) 0\n\n.expansion-panel\n padding: 0\n flex-wrap: wrap\n margin-top: -1px\n // &.collapsed\n // .expansion-panel-header\n // border-bottom-width: 0;\n\n.sub-expansion-panel\n margin: -1px calc(var(--panel-padding-h) * -0.5) 0\n overflow: hidden\n &:first-child\n .expansion-panel-header\n border-top-width: 0\n .panel-subhead\n border-top: none\n border-bottom: none\n\n .expansion-panel-header\n background-color: var(--accent-secondary-color)\n cursor: pointer\n &:hover\n background-color: var(--accent-secondary-hover-color)\n h2, h3, h4\n font-weight: 500\n border-bottom: 1px solid var(--tertiary-border-color)\n border-top: 1px solid var(--tertiary-border-color)\n margin-top: -1px\n padding: 5px 1em 5px\n align-items: center\n\n.expansion-summary-title-help\n margin-left: 5px\n :global(.bp5-icon)\n margin-left: 5px\n\n.expansion-panel-header\n cursor: pointer\n &:hover\n background-color: var(--accent-hover-color)\n :global(.bp5-icon)\n transform: translate(0,3px)\n\n.expansion-children\n padding: 5px 1em 10px\n .expansion-panel\n margin-left: -1em\n margin-right: -1em\n &:first-child\n margin-top: -5px\n\n.expansion-panel-subtext\n font-size: 85%\n font-weight: 400\n\n:global\n .expansion-panel-root\n padding-left: 15px !important\n\n .expansion-panel-detail\n display: block !important\n padding: 0 !important\n\n .expansion-panel-detail-sub\n display: block !important\n\n// New expandable panel for details\n.expandable-details-main\n display: flex\n flex-direction: row\n align-items: center\n justify-content: space-between\n margin: 3px 0\n\n.expandable-details-header\n display: inline-flex\n flex-direction: row\n align-items: baseline\n flex-grow: 1\n\n.expandable-details-children\n position: relative\n\n.expandable-details-toggle\n :global(.bp5-button)\n font-size: 10px\n\n.expandable-details\n &.macrostrat-unit\n .title:after\n content: none\n .title\n margin-right: 1em\n &:after\n content: \":\"\n\n.expansion-body\n display: inline-block\n //flex-direction row\n align-items: baseline\n background-color: var(--tertiary-background)\n padding: 2px 6px\n border-radius: 4px\n width: 100%\n box-shadow: 0px 1px 2px 1px rgba(0,0,0,0.2)\n margin-bottom: 6px\n\n.expansion-panel-detail-header\n font-size: 90%\n font-style: italic\n margin-right: 1em\n display: inline\n color: var(--secondary-color)\n &:after\n content: \":\"\n\n.expansion-panel-detail-body\n display: inline\n","import hyper from \"@macrostrat/hyper\";\nimport styles from \"./main.module.sass\";\n\nconst h = hyper.styled(styles);\n\nexport function PanelSubhead(props) {\n const { title, component = \"h3\", children, ...rest } = props;\n return h(\"div.panel-subhead\", rest, [\n h(\n component,\n {\n className: \"title\",\n },\n title\n ),\n children,\n ]);\n}\n"],"names":[],"version":3,"file":"module.js.map"}
|