@sanity/google-maps-input
6.1.156.1.16
~
Modified (4 files)
Index: package/package.json
===================================================================
--- package/package.json
+++ package/package.json
@@ -1,7 +1,7 @@
{
"name": "@sanity/google-maps-input",
- "version": "6.1.15",
+ "version": "6.1.16",
"description": "Sanity plugin providing input handlers for geo-related input types using Google Maps",
"keywords": [
"cms",
"content",
@@ -39,25 +39,25 @@
"./package.json": "./package.json"
},
"dependencies": {
"@sanity/icons": "^5.2.3",
- "@sanity/ui": "^4.4.0",
+ "@sanity/ui": "^4.4.4",
"@vis.gl/react-google-maps": "^1.10.1"
},
"devDependencies": {
"@sanity/tsconfig": "^2.2.1",
- "@sanity/tsdown-config": "^0.27.1",
- "@sanity/vanilla-extract-vite-plugin": "^0.2.23",
+ "@sanity/tsdown-config": "^0.28.8",
+ "@sanity/vanilla-extract-vite-plugin": "^0.2.26",
"@types/google.maps": "^3.65.5",
"@types/react": "^19.3.0",
"@types/react-dom": "^19.3.0",
- "@vanilla-extract/css": "^1.21.2",
+ "@vanilla-extract/css": "^1.21.3",
"oxc-transform-react": "^0.153.0",
"react": "^19.3.0",
"react-dom": "^19.3.0",
- "sanity": "^6.16.0",
+ "sanity": "^6.18.0",
"styled-components": "^6.5.3",
- "tsdown": "^0.22.14"
+ "tsdown": "^0.23.1"
},
"peerDependencies": {
"react": "^19.2",
"react-dom": "^19.2", Index: package/dist/index.d.ts.map
===================================================================
--- package/dist/index.d.ts.map
+++ package/dist/index.d.ts.map
@@ -1,1 +1,1 @@
-{"version":3,"file":"index.d.ts","names":[],"sources":["../src/diff/GeopointDiff.tsx","../src/types.ts","../src/input/GeopointInput.tsx","../src/input/GeopointRadiusInput.tsx","../src/plugin.tsx"],"mappings":";;;;;;;;iBAUgB,eAAc,MAAM,cAAa,UAAU,8BAAW,IAAA;UCRrD;EACf;EACA;;UAGe;EACf;EACA;EACA;EACA;EACA;EACA;;UAGe;EACf;EACA;EACA;EACA;EACA;EACA;;KAGU,qBAAqB;KAErB,2BAA2B;UAEtB;EACf;EACA;EACA;EACA;EACA;IACE;IACA;;EAEF;EACA;;KCpBU,qBAAqB,iBAAiB;EAChD,WAAW;;iBAGG,cAAc,OAAO,qCAAkB,IAAA;KCJ3C,2BAA2B,iBAAiB;EACtD,WAAW;;iBAGG,oBAAoB,OAAO,2CAAwB,IAAA;cCftD,kCAAe,OAAA"}
\ No newline at end of file
+{"version":3,"file":"index.d.ts","names":[],"sources":["../src/diff/GeopointDiff.tsx","../src/types.ts","../src/input/GeopointInput.tsx","../src/input/GeopointRadiusInput.tsx","../src/plugin.tsx"],"mappings":";;;;;;;;wBAUgB,eAAc,MAAM,cAAa,UAAU,8BAAW,IAAA;UCRrD;EACf;EACA;;UAGe;EACf;EACA;EACA;EACA;EACA;EACA;;UAGe;EACf;EACA;EACA;EACA;EACA;EACA;;KAGU,qBAAqB;KAErB,2BAA2B;UAEtB;EACf;EACA;EACA;EACA;EACA;IACE;IACA;;EAEF;EACA;;KCpBU,qBAAqB,iBAAiB;EAChD,WAAW;;wBAGG,cAAc,OAAO,qCAAkB,IAAA;KCJ3C,2BAA2B,iBAAiB;EACtD,WAAW;;wBAGG,oBAAoB,OAAO,2CAAwB,IAAA;qBCftD,kCAAe,OAAA"}
\ No newline at end of file Index: package/dist/index.js.map
===================================================================
--- package/dist/index.js.map
+++ package/dist/index.js.map
@@ -1,1 +1,1 @@
-{"version":3,"file":"index.js","names":["{value}: {value?: MapValue}","<div className={mapDiffPlaceholder}>\n <Flex align=\"center\" gap={2} justify=\"center\" padding={3}>\n <Text muted size={1}>\n <ImageIcon />\n </Text>\n <Text muted size={1}>\n Map preview unavailable\n </Text>\n </Flex>\n </div>","hasRadius(value)\n ? getGeopointRadiusStaticMapUrl(value, apiKey, {width: 500, height: 280})\n : getGeopointStaticMapUrl(value, apiKey, {width: 500, height: 280})","() => setFailed(true)","<img\n className={mapDiffImage}\n alt=\"\"\n src={url}\n onError={() => setFailed(true)}\n height={280}\n width={500}\n />","_c","{diff, schemaType}: DiffProps<ObjectDiff>","<DiffFromTo\n diff={diff}\n schemaType={schemaType}\n previewComponent={StaticMapDiffPreview}\n layout=\"grid\"\n />","_c","<Box paddingLeft={3}>\n <Stack as=\"ul\" gap={2}>\n {REQUIRED_APIS.map((api) => (\n <Text key={api} as=\"li\" size={1} muted>\n {api}\n </Text>\n ))}\n </Stack>\n </Box>","(api) => (\n <Text key={api} as=\"li\" size={1} muted>\n {api}\n </Text>\n )","{\n tone,\n icon,\n title,\n children,\n}: {\n tone: 'caution' | 'critical'\n icon: ReactNode\n title: string\n children: ReactNode\n}","<Box flex=\"none\">\n <Text size={3}>{icon}</Text>\n </Box>","<Text size={1} weight=\"semibold\">\n {title}\n </Text>","<Stack flex={1} gap={4}>\n <Text size={1} weight=\"semibold\">\n {title}\n </Text>\n {children}\n </Stack>","<Flex gap={3}>\n <Box flex=\"none\">\n <Text size={3}>{icon}</Text>\n </Box>\n <Stack flex={1} gap={4}>\n <Text size={1} weight=\"semibold\">\n {title}\n </Text>\n {children}\n </Stack>\n </Flex>","<Card padding={4} radius={2} tone={tone} border>\n <Flex gap={3}>\n <Box flex=\"none\">\n <Text size={3}>{icon}</Text>\n </Box>\n <Stack flex={1} gap={4}>\n <Text size={1} weight=\"semibold\">\n {title}\n </Text>\n {children}\n </Stack>\n </Flex>\n </Card>","{typeTitle}: {typeTitle: string}","<WarningOutlineIcon />","<code>googleMapsInput</code>","<Text size={1} muted>\n The {typeTitle} field uses Google Maps and needs an API key. Add one to the{' '}\n <code>googleMapsInput</code> plugin configuration:\n </Text>","<Card padding={3} radius={2} tone=\"transparent\" border overflow=\"auto\">\n <Code size={1}>{`googleMapsInput({apiKey: 'your-api-key'})`}</Code>\n </Card>","<Stack gap={3}>\n <Text size={1} muted>\n The key needs these APIs enabled:\n </Text>\n <RequiredApis />\n </Stack>","<a href={GET_API_KEY_URL} target=\"_blank\" rel=\"noopener noreferrer\">\n Get an API key\n </a>","<Text size={1} muted>\n <a href={GET_API_KEY_URL} target=\"_blank\" rel=\"noopener noreferrer\">\n Get an API key\n </a>\n {' · '}\n <a href={DEMO_KEY_URL} target=\"_blank\" rel=\"noopener noreferrer\">\n use a demo key to test\n </a>\n </Text>","<MessageCard tone=\"caution\" icon={<WarningOutlineIcon />} title=\"Google Maps API key required\">\n <Text size={1} muted>\n The {typeTitle} field uses Google Maps and needs an API key. Add one to the{' '}\n <code>googleMapsInput</code> plugin configuration:\n </Text>\n <Card padding={3} radius={2} tone=\"transparent\" border overflow=\"auto\">\n <Code size={1}>{`googleMapsInput({apiKey: 'your-api-key'})`}</Code>\n </Card>\n <Stack gap={3}>\n <Text size={1} muted>\n The key needs these APIs enabled:\n </Text>\n <RequiredApis />\n </Stack>\n <Text size={1} muted>\n <a href={GET_API_KEY_URL} target=\"_blank\" rel=\"noopener noreferrer\">\n Get an API key\n </a>\n {' · '}\n <a href={DEMO_KEY_URL} target=\"_blank\" rel=\"noopener noreferrer\">\n use a demo key to test\n </a>\n </Text>\n </MessageCard>","<ErrorOutlineIcon />","<MessageCard tone=\"critical\" icon={<ErrorOutlineIcon />} title=\"Map preview couldn’t load\">\n <Text size={1} muted>\n The Google Maps API key was rejected. Check that it is a valid key — not a demo or\n placeholder key — that it is not restricted in a way that blocks this Studio’s URL, and that\n it has these APIs enabled:\n </Text>\n <RequiredApis />\n </MessageCard>","_c","_temp","{children}: {children: ReactNode}","<InvalidApiKeyCard />","<Flex align=\"center\" justify=\"center\" height=\"fill\" padding={4}>\n <Spinner muted />\n </Flex>","<>{children}</>","_c","_Fragment","{onSelect}: Props","<gmp-place-autocomplete\n className={searchInput}\n ongmp-select={async ({placePrediction}: google.maps.places.PlacePredictionSelectEvent) => {\n const place = placePrediction.toPlace()\n await place.fetchFields({fields: ['location']})\n\n const location = place.location\n if (!location) {\n return\n }\n\n const latLng = {lat: location.lat(), lng: location.lng()}\n onSelect(latLng)\n map?.panTo(latLng)\n }}\n />","map?.panTo","{placePrediction}: google.maps.places.PlacePredictionSelectEvent","_c","{\n value,\n onChange,\n onZoomChange,\n defaultLocation = defaultMapLocation,\n defaultZoom = 8,\n}: SelectProps","defaultLocation = defaultMapLocation","defaultZoom = 8","getValidLatLng(value)","{\n ...fallbackLatLng,\n ...defaultLocation,\n ...position,\n }","Math.round(defaultZoom)","(event: MapMouseEvent) => {\n if (event.detail.latLng && onChange) {\n onChange(event.detail.latLng)\n }\n }","useCallback(\n (event: MapMouseEvent) => {\n if (event.detail.latLng && onChange) {\n onChange(event.detail.latLng)\n }\n },\n [onChange],\n )","(event: google.maps.MapMouseEvent) => {\n if (event.latLng && onChange) {\n onChange({lat: event.latLng.lat(), lng: event.latLng.lng()})\n }\n }","event","useCallback(\n (event: google.maps.MapMouseEvent) => {\n if (event.latLng && onChange) {\n onChange({lat: event.latLng.lat(), lng: event.latLng.lng()})\n }\n },\n [onChange],\n )","(location: LatLng) => {\n onChange?.(location)\n }","useCallback(\n (location: LatLng) => {\n onChange?.(location)\n },\n [onChange],\n )","(event: MapCameraChangedEvent) => {\n if (!onZoomChange) return\n const zoom = Math.round(event.detail.zoom)\n if (zoom !== lastZoomRef.current) {\n lastZoomRef.current = zoom\n onZoomChange(zoom)\n }\n }","useCallback(\n (event: MapCameraChangedEvent) => {\n if (!onZoomChange) return\n const zoom = Math.round(event.detail.zoom)\n if (zoom !== lastZoomRef.current) {\n lastZoomRef.current = zoom\n onZoomChange(zoom)\n }\n },\n [onZoomChange],\n )","{width: '100%', height: '100%'}","<MapControl position={ControlPosition.TOP_RIGHT}>\n <SearchInput onSelect={handleSelect} />\n </MapControl>","position && (\n <AdvancedMarker\n position={position}\n draggable={Boolean(onChange)}\n onDragEnd={handleMarkerDragEnd}\n />\n )","<Map\n mapId={MAP_ID}\n defaultCenter={center}\n defaultZoom={defaultZoom}\n onClick={handleMapClick}\n onZoomChanged={onZoomChange ? handleZoomChanged : undefined}\n gestureHandling=\"greedy\"\n streetViewControl={false}\n mapTypeControl={false}\n style={{width: '100%', height: '100%'}}\n >\n <MapControl position={ControlPosition.TOP_RIGHT}>\n <SearchInput onSelect={handleSelect} />\n </MapControl>\n {position && (\n <AdvancedMarker\n position={position}\n draggable={Boolean(onChange)}\n onDragEnd={handleMarkerDragEnd}\n />\n )}\n </Map>","onZoomChange ? handleZoomChanged : undefined","fallbackLatLng","defaultMapLocation","_c","handleZoomChanged","{url, onClick, onDoubleClick}: StaticMapPreviewProps","<InvalidApiKeyCard />","() => setFailed(true)","<StaticMap className={staticMapImage} url={url} />","<div\n className={staticMapContainer}\n onClick={onClick}\n onDoubleClick={onDoubleClick}\n onErrorCapture={() => setFailed(true)}\n >\n <StaticMap className={staticMapImage} url={url} />\n </div>","_c","() => inputRef?.current?.focus()","inputRef?.current?.focus","useCallback(() => inputRef?.current?.focus(), [inputRef])","() => {\n if (dialogRef.current) dialogRef.current.blur()\n setModalOpen(false)\n handleFocusButton()\n }","useCallback(() => {\n if (dialogRef.current) dialogRef.current.blur()\n setModalOpen(false)\n handleFocusButton()\n }, [setModalOpen, handleFocusButton])","() => setModalOpen((currentState) => !currentState)","(currentState) => !currentState","useCallback(\n () => setModalOpen((currentState) => !currentState),\n [setModalOpen],\n )","(latLng: LatLng) => {\n onChange([\n setIfMissing({_type: schemaTypeName}),\n set(latLng.lat, ['lat']),\n set(latLng.lng, ['lng']),\n ])\n }","useCallback(\n (latLng: LatLng) => {\n onChange([\n setIfMissing({_type: schemaTypeName}),\n set(latLng.lat, ['lat']),\n set(latLng.lng, ['lng']),\n ])\n },\n [schemaTypeName, onChange],\n )","(zoom: number) => {\n onChange([setIfMissing({_type: schemaTypeName}), set(zoom, ['zoom'])])\n }","useCallback(\n (zoom: number) => {\n onChange([setIfMissing({_type: schemaTypeName}), set(zoom, ['zoom'])])\n },\n [schemaTypeName, onChange],\n )","() => {\n onChange(unset())\n }","useCallback(() => {\n onChange(unset())\n }, [onChange])","() => {\n if (modalOpen) {\n onPathFocus(EMPTY_PATH)\n }\n }","[modalOpen, onPathFocus]","<MissingApiKeyCard typeTitle=\"Geopoint\" />","position\n ? getGeopointStaticMapUrl(position, config.apiKey, {zoom: value?.zoom})\n : null","config.apiKey","staticImageUrl && (\n <ChangeIndicator path={path} isChanged={changed} hasFocus={!!focused}>\n <StaticMapPreview\n url={staticImageUrl}\n onClick={handleFocusButton}\n onDoubleClick={handleToggleModal}\n />\n </ChangeIndicator>\n )","<Button\n aria-describedby={ariaDescribedBy}\n disabled={readOnly}\n icon={position ? EditIcon : undefined}\n id={id}\n mode=\"ghost\"\n onClick={handleToggleModal}\n onFocus={handleFocus}\n padding={3}\n ref={inputRef}\n text={position ? 'Edit' : 'Set location'}\n />","position ? EditIcon : undefined","position ? 'Edit' : 'Set location'","position && (\n <Button\n disabled={readOnly}\n icon={TrashIcon}\n mode=\"ghost\"\n onClick={handleClear}\n padding={3}\n text=\"Remove\"\n tone=\"critical\"\n />\n )","<Box>\n <Grid gridTemplateColumns={position ? 2 : 1} gap={3}>\n <Button\n aria-describedby={ariaDescribedBy}\n disabled={readOnly}\n icon={position ? EditIcon : undefined}\n id={id}\n mode=\"ghost\"\n onClick={handleToggleModal}\n onFocus={handleFocus}\n padding={3}\n ref={inputRef}\n text={position ? 'Edit' : 'Set location'}\n />\n\n {position && (\n <Button\n disabled={readOnly}\n icon={TrashIcon}\n mode=\"ghost\"\n onClick={handleClear}\n padding={3}\n text=\"Remove\"\n tone=\"critical\"\n />\n )}\n </Grid>\n </Box>","position ? 2 : 1","modalOpen && (\n <Dialog\n header=\"Place the marker on the map\"\n id={`${dialogId}_dialog`}\n onBlur={handleBlur}\n onClose={handleCloseModal}\n ref={dialogRef}\n width={1}\n >\n <div className={dialogInnerContainer}>\n <APIProvider apiKey={config.apiKey}>\n <MapApiGate>\n <GeopointSelect\n value={value || undefined}\n onChange={readOnly ? undefined : handleChange}\n onZoomChange={readOnly || !config.saveZoom ? undefined : handleZoomChange}\n defaultLocation={config.defaultLocation}\n defaultZoom={value?.zoom || config.defaultZoom}\n />\n </MapApiGate>\n </APIProvider>\n </div>\n </Dialog>\n )","config.saveZoom","<Stack gap={3}>\n {staticImageUrl && (\n <ChangeIndicator path={path} isChanged={changed} hasFocus={!!focused}>\n <StaticMapPreview\n url={staticImageUrl}\n onClick={handleFocusButton}\n onDoubleClick={handleToggleModal}\n />\n </ChangeIndicator>\n )}\n\n <Box>\n <Grid gridTemplateColumns={position ? 2 : 1} gap={3}>\n <Button\n aria-describedby={ariaDescribedBy}\n disabled={readOnly}\n icon={position ? EditIcon : undefined}\n id={id}\n mode=\"ghost\"\n onClick={handleToggleModal}\n onFocus={handleFocus}\n padding={3}\n ref={inputRef}\n text={position ? 'Edit' : 'Set location'}\n />\n\n {position && (\n <Button\n disabled={readOnly}\n icon={TrashIcon}\n mode=\"ghost\"\n onClick={handleClear}\n padding={3}\n text=\"Remove\"\n tone=\"critical\"\n />\n )}\n </Grid>\n </Box>\n\n {modalOpen && (\n <Dialog\n header=\"Place the marker on the map\"\n id={`${dialogId}_dialog`}\n onBlur={handleBlur}\n onClose={handleCloseModal}\n ref={dialogRef}\n width={1}\n >\n <div className={dialogInnerContainer}>\n <APIProvider apiKey={config.apiKey}>\n <MapApiGate>\n <GeopointSelect\n value={value || undefined}\n onChange={readOnly ? undefined : handleChange}\n onZoomChange={readOnly || !config.saveZoom ? undefined : handleZoomChange}\n defaultLocation={config.defaultLocation}\n defaultZoom={value?.zoom || config.defaultZoom}\n />\n </MapApiGate>\n </APIProvider>\n </div>\n </Dialog>\n )}\n </Stack>","EMPTY_PATH","_c","_temp","{\n value,\n onChange,\n defaultLocation = defaultMapLocation,\n defaultRadiusZoom = 12,\n defaultRadius = 1000,\n}: SelectProps","defaultLocation = defaultMapLocation","defaultRadiusZoom = 12","defaultRadius = 1000","getValidLatLng(value)","{\n ...fallbackLatLng,\n ...defaultLocation,\n ...position,\n }","(latLng: LatLng, radius?: number) => {\n onChange?.(latLng, radius == null ? undefined : Math.round(radius))\n }","useCallback(\n (latLng: LatLng, radius?: number) => {\n onChange?.(latLng, radius == null ? undefined : Math.round(radius))\n },\n [onChange],\n )","(event: MapMouseEvent) => {\n if (event.detail.latLng) {\n setValue(event.detail.latLng, currentRadius)\n }\n }","useCallback(\n (event: MapMouseEvent) => {\n if (event.detail.latLng) {\n setValue(event.detail.latLng, currentRadius)\n }\n },\n [setValue, currentRadius],\n )","(event: google.maps.MapMouseEvent) => {\n if (event.latLng) {\n setValue({lat: event.latLng.lat(), lng: event.latLng.lng()}, currentRadius)\n }\n }","event","useCallback(\n (event: google.maps.MapMouseEvent) => {\n if (event.latLng) {\n setValue({lat: event.latLng.lat(), lng: event.latLng.lng()}, currentRadius)\n }\n },\n [setValue, currentRadius],\n )","(location: LatLng) => setValue(location, currentRadius)","useCallback(\n (location: LatLng) => setValue(location, currentRadius),\n [setValue, currentRadius],\n )","(radius: number) => {\n if (value) {\n setValue({lat: value.lat, lng: value.lng}, radius)\n }\n }","radius","useCallback(\n (radius: number) => {\n if (value) {\n setValue({lat: value.lat, lng: value.lng}, radius)\n }\n },\n [setValue, value],\n )","{width: '100%', height: '100%'}","<MapControl position={ControlPosition.TOP_RIGHT}>\n <SearchInput onSelect={handleSelect} />\n </MapControl>","position && (\n <>\n <AdvancedMarker\n position={position}\n draggable={Boolean(onChange)}\n onDragEnd={handleMarkerDragEnd}\n />\n <Circle\n center={position}\n radius={currentRadius}\n editable={Boolean(onChange)}\n draggable={Boolean(onChange)}\n fillColor=\"#4285F4\"\n fillOpacity={0.2}\n strokeColor=\"#4285F4\"\n strokeOpacity={0.8}\n strokeWeight={2}\n onRadiusChanged={handleCircleRadiusChanged}\n onDragEnd={handleCircleDragEnd}\n />\n </>\n )","<Map\n mapId={MAP_ID}\n defaultCenter={center}\n defaultZoom={defaultRadiusZoom}\n onClick={handleMapClick}\n gestureHandling=\"greedy\"\n streetViewControl={false}\n mapTypeControl={false}\n style={{width: '100%', height: '100%'}}\n >\n <MapControl position={ControlPosition.TOP_RIGHT}>\n <SearchInput onSelect={handleSelect} />\n </MapControl>\n {position && (\n <>\n <AdvancedMarker\n position={position}\n draggable={Boolean(onChange)}\n onDragEnd={handleMarkerDragEnd}\n />\n <Circle\n center={position}\n radius={currentRadius}\n editable={Boolean(onChange)}\n draggable={Boolean(onChange)}\n fillColor=\"#4285F4\"\n fillOpacity={0.2}\n strokeColor=\"#4285F4\"\n strokeOpacity={0.8}\n strokeWeight={2}\n onRadiusChanged={handleCircleRadiusChanged}\n onDragEnd={handleCircleDragEnd}\n />\n </>\n )}\n </Map>","_c","_Fragment","() => inputRef?.current?.focus()","inputRef?.current?.focus","useCallback(() => inputRef?.current?.focus(), [inputRef])","() => {\n if (dialogRef.current) dialogRef.current.blur()\n setModalOpen(false)\n handleFocusButton()\n }","useCallback(() => {\n if (dialogRef.current) dialogRef.current.blur()\n setModalOpen(false)\n handleFocusButton()\n }, [setModalOpen, handleFocusButton])","() => setModalOpen((currentState) => !currentState)","(currentState) => !currentState","useCallback(\n () => setModalOpen((currentState) => !currentState),\n [setModalOpen],\n )","(latLng: LatLng, radius?: number) => {\n const currentRadius = radius ?? value?.radius ?? config.defaultRadius ?? 1000\n onChange([\n setIfMissing({_type: schemaTypeName}),\n set(latLng.lat, ['lat']),\n set(latLng.lng, ['lng']),\n set(currentRadius, ['radius']),\n ])\n }","defaultRadius","radius","useCallback(\n (latLng: LatLng, radius?: number) => {\n const currentRadius = radius ?? value?.radius ?? config.defaultRadius ?? 1000\n onChange([\n setIfMissing({_type: schemaTypeName}),\n set(latLng.lat, ['lat']),\n set(latLng.lng, ['lng']),\n set(currentRadius, ['radius']),\n ])\n },\n [schemaTypeName, onChange, value?.radius, config.defaultRadius],\n )","(event: React.ChangeEvent<HTMLInputElement>) => {\n if (value) {\n onChange([set(Math.round(Number(event.currentTarget.value)), ['radius'])])\n }\n }","useCallback(\n (event: React.ChangeEvent<HTMLInputElement>) => {\n if (value) {\n onChange([set(Math.round(Number(event.currentTarget.value)), ['radius'])])\n }\n },\n [onChange, value],\n )","() => {\n onChange(unset())\n }","useCallback(() => {\n onChange(unset())\n }, [onChange])","() => {\n if (modalOpen) {\n onPathFocus(EMPTY_PATH)\n }\n }","[modalOpen, onPathFocus]","<MissingApiKeyCard typeTitle=\"Geopoint Radius\" />","position\n ? getGeopointRadiusStaticMapUrl(\n {lat: position.lat, lng: position.lng, radius: value?.radius ?? 0},\n config.apiKey,\n )\n : null","apiKey","Math.round(value?.radius || config.defaultRadius || 1000)","staticImageUrl && (\n <ChangeIndicator path={path} isChanged={changed} hasFocus={!!focused}>\n <StaticMapPreview\n url={staticImageUrl}\n onClick={handleFocusButton}\n onDoubleClick={handleToggleModal}\n />\n </ChangeIndicator>\n )","position && (\n <Stack gap={2}>\n <Label>Radius (meters)</Label>\n <TextInput\n type=\"number\"\n value={radius}\n onChange={handleRadiusChange}\n disabled={readOnly}\n min={1}\n max={50000}\n step={1}\n />\n </Stack>\n )","<Button\n aria-describedby={ariaDescribedBy}\n disabled={readOnly}\n icon={position ? EditIcon : undefined}\n id={id}\n mode=\"ghost\"\n onClick={handleToggleModal}\n onFocus={handleFocus}\n padding={3}\n ref={inputRef}\n text={position ? 'Edit' : 'Set location and radius'}\n />","position ? EditIcon : undefined","position ? 'Edit' : 'Set location and radius'","position && (\n <Button\n disabled={readOnly}\n icon={TrashIcon}\n mode=\"ghost\"\n onClick={handleClear}\n padding={3}\n text=\"Remove\"\n tone=\"critical\"\n />\n )","<Box>\n <Grid gridTemplateColumns={position ? 2 : 1} gap={3}>\n <Button\n aria-describedby={ariaDescribedBy}\n disabled={readOnly}\n icon={position ? EditIcon : undefined}\n id={id}\n mode=\"ghost\"\n onClick={handleToggleModal}\n onFocus={handleFocus}\n padding={3}\n ref={inputRef}\n text={position ? 'Edit' : 'Set location and radius'}\n />\n\n {position && (\n <Button\n disabled={readOnly}\n icon={TrashIcon}\n mode=\"ghost\"\n onClick={handleClear}\n padding={3}\n text=\"Remove\"\n tone=\"critical\"\n />\n )}\n </Grid>\n </Box>","position ? 2 : 1","modalOpen && (\n <Dialog\n header=\"Place the marker and set radius on the map\"\n id={`${dialogId}_dialog`}\n onBlur={handleBlur}\n onClose={handleCloseModal}\n ref={dialogRef}\n width={1}\n >\n <div className={dialogInnerContainer}>\n <APIProvider apiKey={config.apiKey}>\n <MapApiGate>\n <GeopointRadiusSelect\n value={value || undefined}\n onChange={readOnly ? undefined : handleChange}\n defaultLocation={config.defaultLocation}\n defaultRadiusZoom={config.defaultRadiusZoom}\n defaultRadius={config.defaultRadius}\n />\n </MapApiGate>\n </APIProvider>\n </div>\n </Dialog>\n )","defaultLocation","defaultRadiusZoom","<Stack gap={3}>\n {staticImageUrl && (\n <ChangeIndicator path={path} isChanged={changed} hasFocus={!!focused}>\n <StaticMapPreview\n url={staticImageUrl}\n onClick={handleFocusButton}\n onDoubleClick={handleToggleModal}\n />\n </ChangeIndicator>\n )}\n\n {position && (\n <Stack gap={2}>\n <Label>Radius (meters)</Label>\n <TextInput\n type=\"number\"\n value={radius}\n onChange={handleRadiusChange}\n disabled={readOnly}\n min={1}\n max={50000}\n step={1}\n />\n </Stack>\n )}\n\n <Box>\n <Grid gridTemplateColumns={position ? 2 : 1} gap={3}>\n <Button\n aria-describedby={ariaDescribedBy}\n disabled={readOnly}\n icon={position ? EditIcon : undefined}\n id={id}\n mode=\"ghost\"\n onClick={handleToggleModal}\n onFocus={handleFocus}\n padding={3}\n ref={inputRef}\n text={position ? 'Edit' : 'Set location and radius'}\n />\n\n {position && (\n <Button\n disabled={readOnly}\n icon={TrashIcon}\n mode=\"ghost\"\n onClick={handleClear}\n padding={3}\n text=\"Remove\"\n tone=\"critical\"\n />\n )}\n </Grid>\n </Box>\n\n {modalOpen && (\n <Dialog\n header=\"Place the marker and set radius on the map\"\n id={`${dialogId}_dialog`}\n onBlur={handleBlur}\n onClose={handleCloseModal}\n ref={dialogRef}\n width={1}\n >\n <div className={dialogInnerContainer}>\n <APIProvider apiKey={config.apiKey}>\n <MapApiGate>\n <GeopointRadiusSelect\n value={value || undefined}\n onChange={readOnly ? undefined : handleChange}\n defaultLocation={config.defaultLocation}\n defaultRadiusZoom={config.defaultRadiusZoom}\n defaultRadius={config.defaultRadius}\n />\n </MapApiGate>\n </APIProvider>\n </div>\n </Dialog>\n )}\n </Stack>","_c","castedProps"],"sources":["../src/map/staticMapUrl.ts","../src/diff/GeoConfigContext.tsx","../src/diff/StaticMapDiffPreview.css.ts","../src/diff/StaticMapDiffPreview.tsx","../src/diff/GeopointDiff.tsx","../src/input/ApiKeyMessages.tsx","../src/map/MapApiGate.tsx","../src/utils.ts","../src/map/constants.ts","../src/map/SearchInput.css.ts","../src/map/SearchInput.tsx","../src/input/GeopointSelect.tsx","../src/input/StaticMapPreview.css.ts","../src/input/StaticMapPreview.tsx","../src/input/GeopointInput.css.ts","../src/input/GeopointInput.tsx","../src/input/GeopointRadiusSelect.tsx","../src/input/GeopointRadiusInput.tsx","../src/plugin.tsx"],"sourcesContent":["import {createStaticMapsUrl, type StaticMapsLocation} from '@vis.gl/react-google-maps'\n\nimport type {Geopoint, GeopointRadius} from '../types'\n\nconst DEFAULT_WIDTH = 640\nconst DEFAULT_HEIGHT = 300\n// Rough meters-per-degree of latitude, used to translate a radius in meters to a\n// lat/lng delta. Good enough for previewing modest radii.\nconst METERS_PER_DEGREE = 111_000\n// Clamp the latitude cosine away from zero so the radius→longitude conversion\n// can't divide by ~0 near the poles and produce Infinity/NaN coordinates.\nconst MIN_LATITUDE_COSINE = 0.01\nconst CIRCLE_OUTLINE = '0x4285F4'\nconst CIRCLE_FILL = '0x4285F480'\n\n// Meters per degree of longitude at a given latitude (shrinks toward the poles).\nfunction lngMetersPerDegree(lat: number): number {\n return METERS_PER_DEGREE * Math.max(Math.cos((lat * Math.PI) / 180), MIN_LATITUDE_COSINE)\n}\n\nexport interface StaticMapSize {\n width?: number\n height?: number\n}\n\nconst DEFAULT_ZOOM = 13\n\ninterface GeopointStaticMapOptions extends StaticMapSize {\n /** Zoom level for the preview. Defaults to {@link DEFAULT_ZOOM}. */\n zoom?: number\n}\n\n/**\n * Static map preview for a plain geopoint: a single marker centered in view.\n */\nexport function getGeopointStaticMapUrl(\n value: Pick<Geopoint, 'lat' | 'lng'>,\n apiKey: string,\n {\n width = DEFAULT_WIDTH,\n height = DEFAULT_HEIGHT,\n zoom = DEFAULT_ZOOM,\n }: GeopointStaticMapOptions = {},\n): string {\n const center = {lat: value.lat, lng: value.lng}\n return createStaticMapsUrl({\n apiKey,\n width,\n height,\n scale: 2,\n zoom,\n center,\n markers: [{location: center}],\n })\n}\n\nfunction generateCirclePoints(lat: number, lng: number, radius: number): StaticMapsLocation[] {\n const points: StaticMapsLocation[] = []\n const steps = 64\n const latRatio = radius / METERS_PER_DEGREE\n const lngRatio = radius / lngMetersPerDegree(lat)\n\n for (let i = 0; i <= steps; i++) {\n const angle = (i / steps) * 2 * Math.PI\n points.push({\n lat: lat + latRatio * Math.cos(angle),\n lng: lng + lngRatio * Math.sin(angle),\n })\n }\n\n return points\n}\n\n// Extra room around the circle so it never sits flush against the image edge.\n// The Static Maps API only offers discrete zoom levels, so without padding a\n// circle can end up tangent to the border at certain radii.\nconst BOUNDS_PADDING = 1.15\n\n/**\n * The four cardinal extremes of the (padded) circle. Passing these as `visible`\n * lets the Static Maps API auto-fit the viewport around the whole circle —\n * with margin — instead of clipping it.\n */\nfunction getCircleBounds(lat: number, lng: number, radius: number): StaticMapsLocation[] {\n const padded = radius * BOUNDS_PADDING\n const latDelta = padded / METERS_PER_DEGREE\n const lngDelta = padded / lngMetersPerDegree(lat)\n return [\n {lat: lat + latDelta, lng},\n {lat: lat - latDelta, lng},\n {lat, lng: lng + lngDelta},\n {lat, lng: lng - lngDelta},\n ]\n}\n\n/**\n * Static map preview for a geopoint with a radius: a marker plus a filled circle.\n * The viewport is derived from the circle bounds (no fixed zoom) so the entire\n * radius stays within the image.\n */\nexport function getGeopointRadiusStaticMapUrl(\n value: Pick<GeopointRadius, 'lat' | 'lng' | 'radius'>,\n apiKey: string,\n {width = DEFAULT_WIDTH, height = DEFAULT_HEIGHT}: StaticMapSize = {},\n): string {\n if (!value.radius) {\n return getGeopointStaticMapUrl(value, apiKey, {width, height})\n }\n\n return createStaticMapsUrl({\n apiKey,\n width,\n height,\n scale: 2,\n markers: [{location: {lat: value.lat, lng: value.lng}}],\n paths: [\n {\n coordinates: generateCirclePoints(value.lat, value.lng, value.radius),\n color: CIRCLE_OUTLINE,\n weight: 2,\n fillcolor: CIRCLE_FILL,\n },\n ],\n visible: getCircleBounds(value.lat, value.lng, value.radius),\n })\n}\n","import {createContext} from 'react'\n\nimport type {GoogleMapsInputConfig} from '../types'\n\n/**\n * Diff components are resolved by the Studio outside of the form, so they can't\n * receive the plugin config as a prop the way the inputs do. The plugin installs\n * this provider at the Studio layout level so diff previews can read the API key.\n */\nexport const GoogleMapsInputContext = createContext<GoogleMapsInputConfig | null>(null)\nGoogleMapsInputContext.displayName = 'GoogleMapsInputContext'\n","import {style} from '@vanilla-extract/css'\n\nexport const mapDiffImage = style({\n display: 'block',\n width: '100%',\n height: 'auto',\n objectFit: 'contain',\n verticalAlign: 'top',\n})\n\nexport const mapDiffPlaceholder = style({\n width: '100%',\n minHeight: '80px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n})\n","import {ImageIcon} from '@sanity/icons/Image'\nimport {Flex, Text} from '@sanity/ui'\nimport {use, useState} from 'react'\n\nimport {getGeopointRadiusStaticMapUrl, getGeopointStaticMapUrl} from '../map/staticMapUrl'\nimport type {Geopoint, GeopointRadius} from '../types'\nimport {GoogleMapsInputContext} from './GeoConfigContext'\n\nimport {mapDiffImage, mapDiffPlaceholder} from './StaticMapDiffPreview.css'\n\ntype MapValue = Geopoint | GeopointRadius\n\nfunction hasRadius(value: MapValue): value is GeopointRadius {\n return typeof (value as GeopointRadius).radius === 'number'\n}\n\n/**\n * Renders the static map image for a single side of a geopoint/geopointRadius\n * diff. Used as the `previewComponent` for `DiffFromTo`, mirroring how the\n * built-in image diff shows a before/after thumbnail.\n */\nexport function StaticMapDiffPreview({value}: {value?: MapValue}) {\n const [failed, setFailed] = useState(false)\n const apiKey = use(GoogleMapsInputContext)?.apiKey\n\n if (!value || typeof value.lat !== 'number' || typeof value.lng !== 'number' || !apiKey) {\n return null\n }\n\n if (failed) {\n return (\n <div className={mapDiffPlaceholder}>\n <Flex align=\"center\" gap={2} justify=\"center\" padding={3}>\n <Text muted size={1}>\n <ImageIcon />\n </Text>\n <Text muted size={1}>\n Map preview unavailable\n </Text>\n </Flex>\n </div>\n )\n }\n\n const url = hasRadius(value)\n ? getGeopointRadiusStaticMapUrl(value, apiKey, {width: 500, height: 280})\n : getGeopointStaticMapUrl(value, apiKey, {width: 500, height: 280})\n\n return (\n <img\n className={mapDiffImage}\n alt=\"\"\n src={url}\n onError={() => setFailed(true)}\n height={280}\n width={500}\n />\n )\n}\n","import {DiffFromTo, type DiffProps, type ObjectDiff} from 'sanity'\n\nimport {StaticMapDiffPreview} from './StaticMapDiffPreview'\n\n/**\n * Diff component for `geopoint` and `geopointRadius` values. Renders a\n * before/after static map preview using `DiffFromTo`, matching the look of the\n * built-in image diff. Handles both types: the preview detects a `radius` field\n * and draws the radius circle when present.\n */\nexport function GeopointDiff({diff, schemaType}: DiffProps<ObjectDiff>) {\n return (\n <DiffFromTo\n diff={diff}\n schemaType={schemaType}\n previewComponent={StaticMapDiffPreview}\n layout=\"grid\"\n />\n )\n}\n","import {ErrorOutlineIcon} from '@sanity/icons/ErrorOutline'\nimport {WarningOutlineIcon} from '@sanity/icons/WarningOutline'\nimport {Box, Card, Flex, Stack, Text} from '@sanity/ui'\nimport {Code} from '@sanity/ui/code'\nimport type {ReactNode} from 'react'\n\nconst GET_API_KEY_URL = 'https://developers.google.com/maps/documentation/javascript/get-api-key'\nconst DEMO_KEY_URL = 'https://developers.google.com/maps/documentation/javascript/demo-key'\n\n// The APIs the key needs access to for the input to work end to end.\nconst REQUIRED_APIS = [\n 'Google Maps JavaScript API',\n 'Google Static Maps API',\n 'Google Places API (New)',\n] as const\n\nfunction RequiredApis() {\n return (\n <Box paddingLeft={3}>\n <Stack as=\"ul\" gap={2}>\n {REQUIRED_APIS.map((api) => (\n <Text key={api} as=\"li\" size={1} muted>\n {api}\n </Text>\n ))}\n </Stack>\n </Box>\n )\n}\n\nfunction MessageCard({\n tone,\n icon,\n title,\n children,\n}: {\n tone: 'caution' | 'critical'\n icon: ReactNode\n title: string\n children: ReactNode\n}) {\n return (\n <Card padding={4} radius={2} tone={tone} border>\n <Flex gap={3}>\n <Box flex=\"none\">\n <Text size={3}>{icon}</Text>\n </Box>\n <Stack flex={1} gap={4}>\n <Text size={1} weight=\"semibold\">\n {title}\n </Text>\n {children}\n </Stack>\n </Flex>\n </Card>\n )\n}\n\n/**\n * Shown when the plugin has not been given an API key. Explains how to provide\n * one in the plugin config and which Google APIs it needs.\n */\nexport function MissingApiKeyCard({typeTitle}: {typeTitle: string}) {\n return (\n <MessageCard tone=\"caution\" icon={<WarningOutlineIcon />} title=\"Google Maps API key required\">\n <Text size={1} muted>\n The {typeTitle} field uses Google Maps and needs an API key. Add one to the{' '}\n <code>googleMapsInput</code> plugin configuration:\n </Text>\n <Card padding={3} radius={2} tone=\"transparent\" border overflow=\"auto\">\n <Code size={1}>{`googleMapsInput({apiKey: 'your-api-key'})`}</Code>\n </Card>\n <Stack gap={3}>\n <Text size={1} muted>\n The key needs these APIs enabled:\n </Text>\n <RequiredApis />\n </Stack>\n <Text size={1} muted>\n <a href={GET_API_KEY_URL} target=\"_blank\" rel=\"noopener noreferrer\">\n Get an API key\n </a>\n {' · '}\n <a href={DEMO_KEY_URL} target=\"_blank\" rel=\"noopener noreferrer\">\n use a demo key to test\n </a>\n </Text>\n </MessageCard>\n )\n}\n\n/**\n * Shown when a key is configured but Google rejects the request (e.g. an\n * invalid/demo key, a restricted key, or one missing the required APIs).\n */\nexport function InvalidApiKeyCard() {\n return (\n <MessageCard tone=\"critical\" icon={<ErrorOutlineIcon />} title=\"Map preview couldn’t load\">\n <Text size={1} muted>\n The Google Maps API key was rejected. Check that it is a valid key — not a demo or\n placeholder key — that it is not restricted in a way that blocks this Studio’s URL, and that\n it has these APIs enabled:\n </Text>\n <RequiredApis />\n </MessageCard>\n )\n}\n","import {Flex, Spinner} from '@sanity/ui'\nimport {APILoadingStatus, useApiLoadingStatus} from '@vis.gl/react-google-maps'\nimport type {ReactNode} from 'react'\n\nimport {InvalidApiKeyCard} from '../input/ApiKeyMessages'\n\n/**\n * Renders the interactive map only once the Maps JavaScript API has loaded.\n * While loading it shows a spinner, and if the key is rejected it surfaces the\n * same \"invalid key\" guidance used by the static preview. Must be rendered\n * inside an `<APIProvider>`.\n */\nexport function MapApiGate({children}: {children: ReactNode}) {\n const status = useApiLoadingStatus()\n\n if (status === APILoadingStatus.AUTH_FAILURE || status === APILoadingStatus.FAILED) {\n return <InvalidApiKeyCard />\n }\n\n if (status !== APILoadingStatus.LOADED) {\n return (\n <Flex align=\"center\" justify=\"center\" height=\"fill\" padding={4}>\n <Spinner muted />\n </Flex>\n )\n }\n\n return <>{children}</>\n}\n","import type {LatLng} from './types'\n\n/**\n * Geopoint values can exist in a partial/empty state — a freshly added array\n * item is just `{_type, _key}` with no coordinates yet. Passing such a value's\n * `lat`/`lng` (which are `undefined`, or could be `NaN`/`Infinity`) to Google\n * Maps markers, circles or the map center throws an `InvalidValueError`. Use\n * this to extract a usable `LatLng` only when both coordinates are finite\n * numbers, and `null` otherwise.\n */\nexport function getValidLatLng(value: {lat?: number; lng?: number} | undefined): LatLng | null {\n const lat = value?.lat\n const lng = value?.lng\n if (\n typeof lat === 'number' &&\n Number.isFinite(lat) &&\n typeof lng === 'number' &&\n Number.isFinite(lng)\n ) {\n return {lat, lng}\n }\n return null\n}\n","/**\n * Advanced markers require a vector map, which in turn requires a map id.\n * `DEMO_MAP_ID` is Google's reserved id for trying advanced markers without\n * creating a cloud-based map style; it renders the default (red) marker.\n */\nexport const MAP_ID = 'DEMO_MAP_ID'\n","import {style} from '@vanilla-extract/css'\n\nexport const searchInput = style({\n margin: '10px',\n})\n","import {useMap, useMapsLibrary} from '@vis.gl/react-google-maps'\n\nimport type {LatLng} from '../types'\n\nimport {searchInput} from './SearchInput.css'\n\ninterface Props {\n onSelect: (location: LatLng) => void\n}\n\n/**\n * Place search using the `<gmp-place-autocomplete>` web component (Places API\n * New). The element is provided by the `places` library, so we wait for it to\n * load before rendering, then listen for the `gmp-select` event.\n */\nexport function SearchInput({onSelect}: Props) {\n const places = useMapsLibrary('places')\n const map = useMap()\n\n if (!places) {\n return null\n }\n\n return (\n <gmp-place-autocomplete\n className={searchInput}\n ongmp-select={async ({placePrediction}: google.maps.places.PlacePredictionSelectEvent) => {\n const place = placePrediction.toPlace()\n await place.fetchFields({fields: ['location']})\n\n const location = place.location\n if (!location) {\n return\n }\n\n const latLng = {lat: location.lat(), lng: location.lng()}\n onSelect(latLng)\n map?.panTo(latLng)\n }}\n />\n )\n}\n","import {\n AdvancedMarker,\n ControlPosition,\n Map,\n type MapCameraChangedEvent,\n type MapMouseEvent,\n MapControl,\n} from '@vis.gl/react-google-maps'\nimport {useCallback, useRef} from 'react'\n\nimport {MAP_ID} from '../map/constants'\nimport {SearchInput} from '../map/SearchInput'\nimport type {Geopoint, LatLng} from '../types'\nimport {getValidLatLng} from '../utils'\n\nconst fallbackLatLng: LatLng = {lat: 40.7058254, lng: -74.1180863}\nconst defaultMapLocation: LatLng = {lng: 10.74609, lat: 59.91273}\n\ninterface SelectProps {\n value?: Geopoint\n onChange?: (latLng: LatLng) => void\n onZoomChange?: (zoom: number) => void\n defaultLocation?: LatLng\n defaultZoom?: number\n}\n\nexport function GeopointSelect({\n value,\n onChange,\n onZoomChange,\n defaultLocation = defaultMapLocation,\n defaultZoom = 8,\n}: SelectProps) {\n const position = getValidLatLng(value)\n const center: LatLng = {\n ...fallbackLatLng,\n ...defaultLocation,\n ...position,\n }\n\n // Seed with the zoom the map opens at so the initial `zoom_changed` the Maps\n // API emits on load doesn't write a value before the user interacts. Only\n // genuine, distinct integer zoom levels get persisted.\n const lastZoomRef = useRef(Math.round(defaultZoom))\n\n const handleMapClick = useCallback(\n (event: MapMouseEvent) => {\n if (event.detail.latLng && onChange) {\n onChange(event.detail.latLng)\n }\n },\n [onChange],\n )\n\n const handleMarkerDragEnd = useCallback(\n (event: google.maps.MapMouseEvent) => {\n if (event.latLng && onChange) {\n onChange({lat: event.latLng.lat(), lng: event.latLng.lng()})\n }\n },\n [onChange],\n )\n\n const handleSelect = useCallback(\n (location: LatLng) => {\n onChange?.(location)\n },\n [onChange],\n )\n\n const handleZoomChanged = useCallback(\n (event: MapCameraChangedEvent) => {\n if (!onZoomChange) return\n const zoom = Math.round(event.detail.zoom)\n if (zoom !== lastZoomRef.current) {\n lastZoomRef.current = zoom\n onZoomChange(zoom)\n }\n },\n [onZoomChange],\n )\n\n return (\n <Map\n mapId={MAP_ID}\n defaultCenter={center}\n defaultZoom={defaultZoom}\n onClick={handleMapClick}\n onZoomChanged={onZoomChange ? handleZoomChanged : undefined}\n gestureHandling=\"greedy\"\n streetViewControl={false}\n mapTypeControl={false}\n style={{width: '100%', height: '100%'}}\n >\n <MapControl position={ControlPosition.TOP_RIGHT}>\n <SearchInput onSelect={handleSelect} />\n </MapControl>\n {position && (\n <AdvancedMarker\n position={position}\n draggable={Boolean(onChange)}\n onDragEnd={handleMarkerDragEnd}\n />\n )}\n </Map>\n )\n}\n","import {style} from '@vanilla-extract/css'\n\nexport const staticMapContainer = style({\n cursor: 'pointer',\n})\nexport const staticMapImage = style({\n width: '100%',\n height: 'auto',\n display: 'block',\n verticalAlign: 'top',\n})\n","import {StaticMap} from '@vis.gl/react-google-maps'\nimport {useState} from 'react'\n\nimport {InvalidApiKeyCard} from './ApiKeyMessages'\n\nimport {staticMapContainer, staticMapImage} from './StaticMapPreview.css'\n\ninterface StaticMapPreviewProps {\n url: string\n onClick?: () => void\n onDoubleClick?: () => void\n}\n\n/**\n * Renders the Google Static Maps preview (via the library's `StaticMap`). If\n * the image is rejected (invalid/demo key, restricted, or missing Static Maps\n * API access) the broken image is replaced with a helpful error card.\n */\nexport function StaticMapPreview({url, onClick, onDoubleClick}: StaticMapPreviewProps) {\n const [failed, setFailed] = useState(false)\n\n if (failed) {\n return <InvalidApiKeyCard />\n }\n\n return (\n // oxlint-disable-next-line jsx-a11y/click-events-have-key-events,jsx-a11y/no-static-element-interactions\n <div\n className={staticMapContainer}\n onClick={onClick}\n onDoubleClick={onDoubleClick}\n onErrorCapture={() => setFailed(true)}\n >\n <StaticMap className={staticMapImage} url={url} />\n </div>\n )\n}\n","import {style} from '@vanilla-extract/css'\n\nexport const dialogInnerContainer = style({\n height: '40rem',\n})\n","import {EditIcon} from '@sanity/icons/Edit'\nimport {TrashIcon} from '@sanity/icons/Trash'\nimport {Box, Button, Dialog, Grid, Stack} from '@sanity/ui'\nimport {APIProvider} from '@vis.gl/react-google-maps'\nimport {useCallback, useEffect, useId, useRef, useState} from 'react'\nimport {type ObjectInputProps, set, setIfMissing, unset, ChangeIndicator, type Path} from 'sanity'\n\nimport {MapApiGate} from '../map/MapApiGate'\nimport {getGeopointStaticMapUrl} from '../map/staticMapUrl'\nimport type {Geopoint, GoogleMapsInputConfig, LatLng} from '../types'\nimport {getValidLatLng} from '../utils'\nimport {MissingApiKeyCard} from './ApiKeyMessages'\nimport {GeopointSelect} from './GeopointSelect'\nimport {StaticMapPreview} from './StaticMapPreview'\n\nimport {dialogInnerContainer} from './GeopointInput.css'\n\nconst EMPTY_PATH: Path = []\n\nexport type GeopointInputProps = ObjectInputProps<Geopoint> & {\n geoConfig: GoogleMapsInputConfig\n}\n\nexport function GeopointInput(props: GeopointInputProps) {\n const {\n changed,\n elementProps,\n focused,\n geoConfig: config,\n onChange,\n onPathFocus,\n path,\n readOnly,\n schemaType,\n value,\n } = props\n\n const {\n id,\n ref: inputRef,\n onBlur: handleBlur,\n onFocus: handleFocus,\n 'aria-describedby': ariaDescribedBy,\n } = elementProps\n\n const schemaTypeName = schemaType.name\n const dialogId = useId()\n const dialogRef = useRef<HTMLDivElement | null>(null)\n const handleFocusButton = useCallback(() => inputRef?.current?.focus(), [inputRef])\n const [modalOpen, setModalOpen] = useState(false)\n\n const handleCloseModal = useCallback(() => {\n if (dialogRef.current) dialogRef.current.blur()\n setModalOpen(false)\n handleFocusButton()\n }, [setModalOpen, handleFocusButton])\n\n const handleToggleModal = useCallback(\n () => setModalOpen((currentState) => !currentState),\n [setModalOpen],\n )\n\n const handleChange = useCallback(\n (latLng: LatLng) => {\n onChange([\n setIfMissing({_type: schemaTypeName}),\n set(latLng.lat, ['lat']),\n set(latLng.lng, ['lng']),\n ])\n },\n [schemaTypeName, onChange],\n )\n\n const handleZoomChange = useCallback(\n (zoom: number) => {\n onChange([setIfMissing({_type: schemaTypeName}), set(zoom, ['zoom'])])\n },\n [schemaTypeName, onChange],\n )\n\n const handleClear = useCallback(() => {\n onChange(unset())\n }, [onChange])\n\n useEffect(() => {\n if (modalOpen) {\n onPathFocus(EMPTY_PATH)\n }\n }, [modalOpen, onPathFocus])\n\n if (!config || !config.apiKey) {\n return <MissingApiKeyCard typeTitle=\"Geopoint\" />\n }\n\n // A geopoint is only renderable on a map once it has finite coordinates. A\n // freshly added array item is `{_type, _key}` with no lat/lng yet, so gate the\n // map preview and \"edit\" affordances on having a real location.\n const position = getValidLatLng(value)\n const staticImageUrl = position\n ? getGeopointStaticMapUrl(position, config.apiKey, {zoom: value?.zoom})\n : null\n\n return (\n <Stack gap={3}>\n {staticImageUrl && (\n <ChangeIndicator path={path} isChanged={changed} hasFocus={!!focused}>\n <StaticMapPreview\n url={staticImageUrl}\n onClick={handleFocusButton}\n onDoubleClick={handleToggleModal}\n />\n </ChangeIndicator>\n )}\n\n <Box>\n <Grid gridTemplateColumns={position ? 2 : 1} gap={3}>\n <Button\n aria-describedby={ariaDescribedBy}\n disabled={readOnly}\n icon={position ? EditIcon : undefined}\n id={id}\n mode=\"ghost\"\n onClick={handleToggleModal}\n onFocus={handleFocus}\n padding={3}\n ref={inputRef}\n text={position ? 'Edit' : 'Set location'}\n />\n\n {position && (\n <Button\n disabled={readOnly}\n icon={TrashIcon}\n mode=\"ghost\"\n onClick={handleClear}\n padding={3}\n text=\"Remove\"\n tone=\"critical\"\n />\n )}\n </Grid>\n </Box>\n\n {modalOpen && (\n <Dialog\n header=\"Place the marker on the map\"\n id={`${dialogId}_dialog`}\n onBlur={handleBlur}\n onClose={handleCloseModal}\n ref={dialogRef}\n width={1}\n >\n <div className={dialogInnerContainer}>\n <APIProvider apiKey={config.apiKey}>\n <MapApiGate>\n <GeopointSelect\n value={value || undefined}\n onChange={readOnly ? undefined : handleChange}\n onZoomChange={readOnly || !config.saveZoom ? undefined : handleZoomChange}\n defaultLocation={config.defaultLocation}\n defaultZoom={value?.zoom || config.defaultZoom}\n />\n </MapApiGate>\n </APIProvider>\n </div>\n </Dialog>\n )}\n </Stack>\n )\n}\n","import {\n AdvancedMarker,\n Circle,\n ControlPosition,\n Map,\n type MapMouseEvent,\n MapControl,\n} from '@vis.gl/react-google-maps'\nimport {useCallback} from 'react'\n\nimport {MAP_ID} from '../map/constants'\nimport {SearchInput} from '../map/SearchInput'\nimport type {GeopointRadius, LatLng} from '../types'\nimport {getValidLatLng} from '../utils'\n\nconst fallbackLatLng: LatLng = {lat: 40.7058254, lng: -74.1180863}\nconst defaultMapLocation: LatLng = {lng: 10.74609, lat: 59.91273}\n\ninterface SelectProps {\n value?: GeopointRadius\n onChange?: (latLng: LatLng, radius?: number) => void\n defaultLocation?: LatLng\n defaultRadiusZoom?: number\n defaultRadius?: number\n}\n\nexport function GeopointRadiusSelect({\n value,\n onChange,\n defaultLocation = defaultMapLocation,\n defaultRadiusZoom = 12,\n defaultRadius = 1000,\n}: SelectProps) {\n const position = getValidLatLng(value)\n const center: LatLng = {\n ...fallbackLatLng,\n ...defaultLocation,\n ...position,\n }\n const currentRadius = value?.radius ?? defaultRadius\n\n const setValue = useCallback(\n (latLng: LatLng, radius?: number) => {\n onChange?.(latLng, radius == null ? undefined : Math.round(radius))\n },\n [onChange],\n )\n\n const handleMapClick = useCallback(\n (event: MapMouseEvent) => {\n if (event.detail.latLng) {\n setValue(event.detail.latLng, currentRadius)\n }\n },\n [setValue, currentRadius],\n )\n\n const handleMarkerDragEnd = useCallback(\n (event: google.maps.MapMouseEvent) => {\n if (event.latLng) {\n setValue({lat: event.latLng.lat(), lng: event.latLng.lng()}, currentRadius)\n }\n },\n [setValue, currentRadius],\n )\n\n const handleSelect = useCallback(\n (location: LatLng) => setValue(location, currentRadius),\n [setValue, currentRadius],\n )\n\n const handleCircleRadiusChanged = useCallback(\n (radius: number) => {\n if (value) {\n setValue({lat: value.lat, lng: value.lng}, radius)\n }\n },\n [setValue, value],\n )\n\n const handleCircleDragEnd = useCallback(\n (event: google.maps.MapMouseEvent) => {\n if (event.latLng) {\n setValue({lat: event.latLng.lat(), lng: event.latLng.lng()}, currentRadius)\n }\n },\n [setValue, currentRadius],\n )\n\n return (\n <Map\n mapId={MAP_ID}\n defaultCenter={center}\n defaultZoom={defaultRadiusZoom}\n onClick={handleMapClick}\n gestureHandling=\"greedy\"\n streetViewControl={false}\n mapTypeControl={false}\n style={{width: '100%', height: '100%'}}\n >\n <MapControl position={ControlPosition.TOP_RIGHT}>\n <SearchInput onSelect={handleSelect} />\n </MapControl>\n {position && (\n <>\n <AdvancedMarker\n position={position}\n draggable={Boolean(onChange)}\n onDragEnd={handleMarkerDragEnd}\n />\n <Circle\n center={position}\n radius={currentRadius}\n editable={Boolean(onChange)}\n draggable={Boolean(onChange)}\n fillColor=\"#4285F4\"\n fillOpacity={0.2}\n strokeColor=\"#4285F4\"\n strokeOpacity={0.8}\n strokeWeight={2}\n onRadiusChanged={handleCircleRadiusChanged}\n onDragEnd={handleCircleDragEnd}\n />\n </>\n )}\n </Map>\n )\n}\n","import {EditIcon} from '@sanity/icons/Edit'\nimport {TrashIcon} from '@sanity/icons/Trash'\nimport {Box, Button, Dialog, Grid, Stack, TextInput, Label} from '@sanity/ui'\nimport {APIProvider} from '@vis.gl/react-google-maps'\nimport {useCallback, useEffect, useId, useRef, useState} from 'react'\nimport {type ObjectInputProps, set, setIfMissing, unset, ChangeIndicator, type Path} from 'sanity'\n\nimport {MapApiGate} from '../map/MapApiGate'\nimport {getGeopointRadiusStaticMapUrl} from '../map/staticMapUrl'\nimport type {GeopointRadius, GoogleMapsInputConfig, LatLng} from '../types'\nimport {getValidLatLng} from '../utils'\nimport {MissingApiKeyCard} from './ApiKeyMessages'\nimport {GeopointRadiusSelect} from './GeopointRadiusSelect'\nimport {StaticMapPreview} from './StaticMapPreview'\n\nimport {dialogInnerContainer} from './GeopointInput.css'\n\nconst EMPTY_PATH: Path = []\n\nexport type GeopointRadiusInputProps = ObjectInputProps<GeopointRadius> & {\n geoConfig: GoogleMapsInputConfig\n}\n\nexport function GeopointRadiusInput(props: GeopointRadiusInputProps) {\n const {\n changed,\n elementProps,\n focused,\n geoConfig: config,\n onChange,\n onPathFocus,\n path,\n readOnly,\n schemaType,\n value,\n } = props\n\n const {\n id,\n ref: inputRef,\n onBlur: handleBlur,\n onFocus: handleFocus,\n 'aria-describedby': ariaDescribedBy,\n } = elementProps\n\n const schemaTypeName = schemaType.name\n const dialogId = useId()\n const dialogRef = useRef<HTMLDivElement | null>(null)\n const handleFocusButton = useCallback(() => inputRef?.current?.focus(), [inputRef])\n const [modalOpen, setModalOpen] = useState(false)\n\n const handleCloseModal = useCallback(() => {\n if (dialogRef.current) dialogRef.current.blur()\n setModalOpen(false)\n handleFocusButton()\n }, [setModalOpen, handleFocusButton])\n\n const handleToggleModal = useCallback(\n () => setModalOpen((currentState) => !currentState),\n [setModalOpen],\n )\n\n const handleChange = useCallback(\n (latLng: LatLng, radius?: number) => {\n const currentRadius = radius ?? value?.radius ?? config.defaultRadius ?? 1000\n onChange([\n setIfMissing({_type: schemaTypeName}),\n set(latLng.lat, ['lat']),\n set(latLng.lng, ['lng']),\n set(currentRadius, ['radius']),\n ])\n },\n [schemaTypeName, onChange, value?.radius, config.defaultRadius],\n )\n\n const handleRadiusChange = useCallback(\n (event: React.ChangeEvent<HTMLInputElement>) => {\n if (value) {\n onChange([set(Math.round(Number(event.currentTarget.value)), ['radius'])])\n }\n },\n [onChange, value],\n )\n\n const handleClear = useCallback(() => {\n onChange(unset())\n }, [onChange])\n\n useEffect(() => {\n if (modalOpen) {\n onPathFocus(EMPTY_PATH)\n }\n }, [modalOpen, onPathFocus])\n\n if (!config || !config.apiKey) {\n return <MissingApiKeyCard typeTitle=\"Geopoint Radius\" />\n }\n\n // A geopoint is only renderable on a map once it has finite coordinates. A\n // freshly added array item is `{_type, _key}` with no lat/lng yet, so gate the\n // map preview, radius control and \"edit\" affordances on having a real location.\n const position = getValidLatLng(value)\n const radius = Math.round(value?.radius || config.defaultRadius || 1000)\n const staticImageUrl = position\n ? getGeopointRadiusStaticMapUrl(\n {lat: position.lat, lng: position.lng, radius: value?.radius ?? 0},\n config.apiKey,\n )\n : null\n\n return (\n <Stack gap={3}>\n {staticImageUrl && (\n <ChangeIndicator path={path} isChanged={changed} hasFocus={!!focused}>\n <StaticMapPreview\n url={staticImageUrl}\n onClick={handleFocusButton}\n onDoubleClick={handleToggleModal}\n />\n </ChangeIndicator>\n )}\n\n {position && (\n <Stack gap={2}>\n <Label>Radius (meters)</Label>\n <TextInput\n type=\"number\"\n value={radius}\n onChange={handleRadiusChange}\n disabled={readOnly}\n min={1}\n max={50000}\n step={1}\n />\n </Stack>\n )}\n\n <Box>\n <Grid gridTemplateColumns={position ? 2 : 1} gap={3}>\n <Button\n aria-describedby={ariaDescribedBy}\n disabled={readOnly}\n icon={position ? EditIcon : undefined}\n id={id}\n mode=\"ghost\"\n onClick={handleToggleModal}\n onFocus={handleFocus}\n padding={3}\n ref={inputRef}\n text={position ? 'Edit' : 'Set location and radius'}\n />\n\n {position && (\n <Button\n disabled={readOnly}\n icon={TrashIcon}\n mode=\"ghost\"\n onClick={handleClear}\n padding={3}\n text=\"Remove\"\n tone=\"critical\"\n />\n )}\n </Grid>\n </Box>\n\n {modalOpen && (\n <Dialog\n header=\"Place the marker and set radius on the map\"\n id={`${dialogId}_dialog`}\n onBlur={handleBlur}\n onClose={handleCloseModal}\n ref={dialogRef}\n width={1}\n >\n <div className={dialogInnerContainer}>\n <APIProvider apiKey={config.apiKey}>\n <MapApiGate>\n <GeopointRadiusSelect\n value={value || undefined}\n onChange={readOnly ? undefined : handleChange}\n defaultLocation={config.defaultLocation}\n defaultRadiusZoom={config.defaultRadiusZoom}\n defaultRadius={config.defaultRadius}\n />\n </MapApiGate>\n </APIProvider>\n </div>\n </Dialog>\n )}\n </Stack>\n )\n}\n","import {definePlugin, type SchemaType} from 'sanity'\n\nimport {GoogleMapsInputContext} from './diff/GeoConfigContext'\nimport {GeopointDiff} from './diff/GeopointDiff'\nimport {GeopointInput, type GeopointInputProps} from './input/GeopointInput'\nimport {GeopointRadiusInput, type GeopointRadiusInputProps} from './input/GeopointRadiusInput'\nimport type {GeopointSchemaType, GeopointRadiusSchemaType, GoogleMapsInputConfig} from './types'\n\nexport const googleMapsInput = definePlugin<GoogleMapsInputConfig>((config) => {\n return {\n name: 'google-maps-input',\n studio: {\n components: {\n // Make the config (API key) available to diff components, which are\n // resolved outside of the form and so can't receive it as a prop.\n activeToolLayout: function GoogleMapsInputContextProvider(props) {\n return (\n <GoogleMapsInputContext value={config}>\n {props.renderDefault(props)}\n </GoogleMapsInputContext>\n )\n },\n },\n },\n schema: {\n types: [\n {\n name: 'geopointRadius',\n title: 'Geopoint with Radius',\n type: 'object',\n // Only attach the map diff when there's a key to render it with;\n // otherwise fall back to the default per-field (lat/lng/radius) diff.\n components: config.apiKey ? {diff: GeopointDiff} : undefined,\n fields: [\n {\n name: 'lat',\n title: 'Latitude',\n type: 'number',\n validation: (Rule) => Rule.required().min(-90).max(90),\n },\n {\n name: 'lng',\n title: 'Longitude',\n type: 'number',\n validation: (Rule) => Rule.required().min(-180).max(180),\n },\n {\n name: 'alt',\n title: 'Altitude',\n type: 'number',\n },\n {\n name: 'radius',\n title: 'Radius (meters)',\n type: 'number',\n validation: (Rule) => Rule.required().min(1).max(50000),\n },\n ],\n preview: {\n select: {\n lat: 'lat',\n lng: 'lng',\n radius: 'radius',\n },\n prepare({lat, lng, radius}: {lat?: number; lng?: number; radius?: number}) {\n return {\n title:\n typeof lat === 'number' && typeof lng === 'number'\n ? `${lat.toFixed(6)}, ${lng.toFixed(6)}`\n : 'No location set',\n subtitle: radius ? `Radius: ${radius}m` : 'No radius set',\n }\n },\n },\n },\n ],\n },\n form: {\n components: {\n input(props) {\n if (isGeopoint(props.schemaType)) {\n const castedProps = props as unknown as Omit<GeopointInputProps, 'geoConfig'>\n return <GeopointInput {...castedProps} geoConfig={config} />\n }\n if (isGeopointRadius(props.schemaType)) {\n const castedProps = props as unknown as Omit<GeopointRadiusInputProps, 'geoConfig'>\n return <GeopointRadiusInput {...castedProps} geoConfig={config} />\n }\n return props.renderDefault(props)\n },\n },\n },\n }\n})\n\nfunction isGeopoint(schemaType: SchemaType): schemaType is GeopointSchemaType {\n return isType('geopoint', schemaType)\n}\n\nfunction isGeopointRadius(schemaType: SchemaType): schemaType is GeopointRadiusSchemaType {\n return isType('geopointRadius', schemaType)\n}\n\nfunction isType(name: string, schema?: SchemaType): boolean {\n if (schema?.name === name) {\n return true\n } else if (!schema?.name) {\n return false\n }\n return isType(name, schema?.type)\n}\n"],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"index.js","names":["{value}: {value?: MapValue}","<div className={mapDiffPlaceholder}>\n <Flex align=\"center\" gap={2} justify=\"center\" padding={3}>\n <Text muted size={1}>\n <ImageIcon />\n </Text>\n <Text muted size={1}>\n Map preview unavailable\n </Text>\n </Flex>\n </div>","hasRadius(value)\n ? getGeopointRadiusStaticMapUrl(value, apiKey, {width: 500, height: 280})\n : getGeopointStaticMapUrl(value, apiKey, {width: 500, height: 280})","() => setFailed(true)","<img\n className={mapDiffImage}\n alt=\"\"\n src={url}\n onError={() => setFailed(true)}\n height={280}\n width={500}\n />","_c","{diff, schemaType}: DiffProps<ObjectDiff>","<DiffFromTo\n diff={diff}\n schemaType={schemaType}\n previewComponent={StaticMapDiffPreview}\n layout=\"grid\"\n />","_c","<Box paddingLeft={3}>\n <Stack as=\"ul\" gap={2}>\n {REQUIRED_APIS.map((api) => (\n <Text key={api} as=\"li\" size={1} muted>\n {api}\n </Text>\n ))}\n </Stack>\n </Box>","(api) => (\n <Text key={api} as=\"li\" size={1} muted>\n {api}\n </Text>\n )","{\n tone,\n icon,\n title,\n children,\n}: {\n tone: 'caution' | 'critical'\n icon: ReactNode\n title: string\n children: ReactNode\n}","<Box flex=\"none\">\n <Text size={3}>{icon}</Text>\n </Box>","<Text size={1} weight=\"semibold\">\n {title}\n </Text>","<Stack flex={1} gap={4}>\n <Text size={1} weight=\"semibold\">\n {title}\n </Text>\n {children}\n </Stack>","<Flex gap={3}>\n <Box flex=\"none\">\n <Text size={3}>{icon}</Text>\n </Box>\n <Stack flex={1} gap={4}>\n <Text size={1} weight=\"semibold\">\n {title}\n </Text>\n {children}\n </Stack>\n </Flex>","<Card padding={4} radius={2} tone={tone} border>\n <Flex gap={3}>\n <Box flex=\"none\">\n <Text size={3}>{icon}</Text>\n </Box>\n <Stack flex={1} gap={4}>\n <Text size={1} weight=\"semibold\">\n {title}\n </Text>\n {children}\n </Stack>\n </Flex>\n </Card>","{typeTitle}: {typeTitle: string}","<WarningOutlineIcon />","<code>googleMapsInput</code>","<Text size={1} muted>\n The {typeTitle} field uses Google Maps and needs an API key. Add one to the{' '}\n <code>googleMapsInput</code> plugin configuration:\n </Text>","<Card padding={3} radius={2} tone=\"transparent\" border overflow=\"auto\">\n <Code size={1}>{`googleMapsInput({apiKey: 'your-api-key'})`}</Code>\n </Card>","<Stack gap={3}>\n <Text size={1} muted>\n The key needs these APIs enabled:\n </Text>\n <RequiredApis />\n </Stack>","<a href={GET_API_KEY_URL} target=\"_blank\" rel=\"noopener noreferrer\">\n Get an API key\n </a>","<Text size={1} muted>\n <a href={GET_API_KEY_URL} target=\"_blank\" rel=\"noopener noreferrer\">\n Get an API key\n </a>\n {' · '}\n <a href={DEMO_KEY_URL} target=\"_blank\" rel=\"noopener noreferrer\">\n use a demo key to test\n </a>\n </Text>","<MessageCard tone=\"caution\" icon={<WarningOutlineIcon />} title=\"Google Maps API key required\">\n <Text size={1} muted>\n The {typeTitle} field uses Google Maps and needs an API key. Add one to the{' '}\n <code>googleMapsInput</code> plugin configuration:\n </Text>\n <Card padding={3} radius={2} tone=\"transparent\" border overflow=\"auto\">\n <Code size={1}>{`googleMapsInput({apiKey: 'your-api-key'})`}</Code>\n </Card>\n <Stack gap={3}>\n <Text size={1} muted>\n The key needs these APIs enabled:\n </Text>\n <RequiredApis />\n </Stack>\n <Text size={1} muted>\n <a href={GET_API_KEY_URL} target=\"_blank\" rel=\"noopener noreferrer\">\n Get an API key\n </a>\n {' · '}\n <a href={DEMO_KEY_URL} target=\"_blank\" rel=\"noopener noreferrer\">\n use a demo key to test\n </a>\n </Text>\n </MessageCard>","<ErrorOutlineIcon />","<MessageCard tone=\"critical\" icon={<ErrorOutlineIcon />} title=\"Map preview couldn’t load\">\n <Text size={1} muted>\n The Google Maps API key was rejected. Check that it is a valid key — not a demo or\n placeholder key — that it is not restricted in a way that blocks this Studio’s URL, and that\n it has these APIs enabled:\n </Text>\n <RequiredApis />\n </MessageCard>","_c","_temp","{children}: {children: ReactNode}","<InvalidApiKeyCard />","<Flex align=\"center\" justify=\"center\" height=\"fill\" padding={4}>\n <Spinner muted />\n </Flex>","<>{children}</>","_c","_Fragment","{onSelect}: Props","<gmp-place-autocomplete\n className={searchInput}\n ongmp-select={async ({placePrediction}: google.maps.places.PlacePredictionSelectEvent) => {\n const place = placePrediction.toPlace()\n await place.fetchFields({fields: ['location']})\n\n const location = place.location\n if (!location) {\n return\n }\n\n const latLng = {lat: location.lat(), lng: location.lng()}\n onSelect(latLng)\n map?.panTo(latLng)\n }}\n />","map?.panTo","{placePrediction}: google.maps.places.PlacePredictionSelectEvent","_c","{\n value,\n onChange,\n onZoomChange,\n defaultLocation = defaultMapLocation,\n defaultZoom = 8,\n}: SelectProps","defaultLocation = defaultMapLocation","defaultZoom = 8","getValidLatLng(value)","{\n ...fallbackLatLng,\n ...defaultLocation,\n ...position,\n }","Math.round(defaultZoom)","(event: MapMouseEvent) => {\n if (event.detail.latLng && onChange) {\n onChange(event.detail.latLng)\n }\n }","useCallback(\n (event: MapMouseEvent) => {\n if (event.detail.latLng && onChange) {\n onChange(event.detail.latLng)\n }\n },\n [onChange],\n )","(event: google.maps.MapMouseEvent) => {\n if (event.latLng && onChange) {\n onChange({lat: event.latLng.lat(), lng: event.latLng.lng()})\n }\n }","event","useCallback(\n (event: google.maps.MapMouseEvent) => {\n if (event.latLng && onChange) {\n onChange({lat: event.latLng.lat(), lng: event.latLng.lng()})\n }\n },\n [onChange],\n )","(location: LatLng) => {\n onChange?.(location)\n }","useCallback(\n (location: LatLng) => {\n onChange?.(location)\n },\n [onChange],\n )","(event: MapCameraChangedEvent) => {\n if (!onZoomChange) return\n const zoom = Math.round(event.detail.zoom)\n if (zoom !== lastZoomRef.current) {\n lastZoomRef.current = zoom\n onZoomChange(zoom)\n }\n }","useCallback(\n (event: MapCameraChangedEvent) => {\n if (!onZoomChange) return\n const zoom = Math.round(event.detail.zoom)\n if (zoom !== lastZoomRef.current) {\n lastZoomRef.current = zoom\n onZoomChange(zoom)\n }\n },\n [onZoomChange],\n )","{width: '100%', height: '100%'}","<MapControl position={ControlPosition.TOP_RIGHT}>\n <SearchInput onSelect={handleSelect} />\n </MapControl>","position && (\n <AdvancedMarker\n position={position}\n draggable={Boolean(onChange)}\n onDragEnd={handleMarkerDragEnd}\n />\n )","<Map\n mapId={MAP_ID}\n defaultCenter={center}\n defaultZoom={defaultZoom}\n onClick={handleMapClick}\n onZoomChanged={onZoomChange ? handleZoomChanged : undefined}\n gestureHandling=\"greedy\"\n streetViewControl={false}\n mapTypeControl={false}\n style={{width: '100%', height: '100%'}}\n >\n <MapControl position={ControlPosition.TOP_RIGHT}>\n <SearchInput onSelect={handleSelect} />\n </MapControl>\n {position && (\n <AdvancedMarker\n position={position}\n draggable={Boolean(onChange)}\n onDragEnd={handleMarkerDragEnd}\n />\n )}\n </Map>","onZoomChange ? handleZoomChanged : undefined","fallbackLatLng","defaultMapLocation","_c","handleZoomChanged","{url, onClick, onDoubleClick}: StaticMapPreviewProps","<InvalidApiKeyCard />","() => setFailed(true)","<StaticMap className={staticMapImage} url={url} />","<div\n className={staticMapContainer}\n onClick={onClick}\n onDoubleClick={onDoubleClick}\n onErrorCapture={() => setFailed(true)}\n >\n <StaticMap className={staticMapImage} url={url} />\n </div>","_c","() => inputRef?.current?.focus()","inputRef?.current?.focus","useCallback(() => inputRef?.current?.focus(), [inputRef])","() => {\n if (dialogRef.current) dialogRef.current.blur()\n setModalOpen(false)\n handleFocusButton()\n }","useCallback(() => {\n if (dialogRef.current) dialogRef.current.blur()\n setModalOpen(false)\n handleFocusButton()\n }, [setModalOpen, handleFocusButton])","() => setModalOpen((currentState) => !currentState)","(currentState) => !currentState","useCallback(\n () => setModalOpen((currentState) => !currentState),\n [setModalOpen],\n )","(latLng: LatLng) => {\n onChange([\n setIfMissing({_type: schemaTypeName}),\n set(latLng.lat, ['lat']),\n set(latLng.lng, ['lng']),\n ])\n }","useCallback(\n (latLng: LatLng) => {\n onChange([\n setIfMissing({_type: schemaTypeName}),\n set(latLng.lat, ['lat']),\n set(latLng.lng, ['lng']),\n ])\n },\n [schemaTypeName, onChange],\n )","(zoom: number) => {\n onChange([setIfMissing({_type: schemaTypeName}), set(zoom, ['zoom'])])\n }","useCallback(\n (zoom: number) => {\n onChange([setIfMissing({_type: schemaTypeName}), set(zoom, ['zoom'])])\n },\n [schemaTypeName, onChange],\n )","() => {\n onChange(unset())\n }","useCallback(() => {\n onChange(unset())\n }, [onChange])","() => {\n if (modalOpen) {\n onPathFocus(EMPTY_PATH)\n }\n }","[modalOpen, onPathFocus]","<MissingApiKeyCard typeTitle=\"Geopoint\" />","position\n ? getGeopointStaticMapUrl(position, config.apiKey, {zoom: value?.zoom})\n : null","config.apiKey","staticImageUrl && (\n <ChangeIndicator path={path} isChanged={changed} hasFocus={!!focused}>\n <StaticMapPreview\n url={staticImageUrl}\n onClick={handleFocusButton}\n onDoubleClick={handleToggleModal}\n />\n </ChangeIndicator>\n )","<Button\n aria-describedby={ariaDescribedBy}\n disabled={readOnly}\n icon={position ? EditIcon : undefined}\n id={id}\n mode=\"ghost\"\n onClick={handleToggleModal}\n onFocus={handleFocus}\n padding={3}\n ref={inputRef}\n text={position ? 'Edit' : 'Set location'}\n />","position ? EditIcon : undefined","position ? 'Edit' : 'Set location'","position && (\n <Button\n disabled={readOnly}\n icon={TrashIcon}\n mode=\"ghost\"\n onClick={handleClear}\n padding={3}\n text=\"Remove\"\n tone=\"critical\"\n />\n )","<Box>\n <Grid gridTemplateColumns={position ? 2 : 1} gap={3}>\n <Button\n aria-describedby={ariaDescribedBy}\n disabled={readOnly}\n icon={position ? EditIcon : undefined}\n id={id}\n mode=\"ghost\"\n onClick={handleToggleModal}\n onFocus={handleFocus}\n padding={3}\n ref={inputRef}\n text={position ? 'Edit' : 'Set location'}\n />\n\n {position && (\n <Button\n disabled={readOnly}\n icon={TrashIcon}\n mode=\"ghost\"\n onClick={handleClear}\n padding={3}\n text=\"Remove\"\n tone=\"critical\"\n />\n )}\n </Grid>\n </Box>","position ? 2 : 1","modalOpen && (\n <Dialog\n header=\"Place the marker on the map\"\n id={`${dialogId}_dialog`}\n onBlur={handleBlur}\n onClose={handleCloseModal}\n ref={dialogRef}\n width={1}\n >\n <div className={dialogInnerContainer}>\n <APIProvider apiKey={config.apiKey}>\n <MapApiGate>\n <GeopointSelect\n value={value || undefined}\n onChange={readOnly ? undefined : handleChange}\n onZoomChange={readOnly || !config.saveZoom ? undefined : handleZoomChange}\n defaultLocation={config.defaultLocation}\n defaultZoom={value?.zoom || config.defaultZoom}\n />\n </MapApiGate>\n </APIProvider>\n </div>\n </Dialog>\n )","config.saveZoom","<Stack gap={3}>\n {staticImageUrl && (\n <ChangeIndicator path={path} isChanged={changed} hasFocus={!!focused}>\n <StaticMapPreview\n url={staticImageUrl}\n onClick={handleFocusButton}\n onDoubleClick={handleToggleModal}\n />\n </ChangeIndicator>\n )}\n\n <Box>\n <Grid gridTemplateColumns={position ? 2 : 1} gap={3}>\n <Button\n aria-describedby={ariaDescribedBy}\n disabled={readOnly}\n icon={position ? EditIcon : undefined}\n id={id}\n mode=\"ghost\"\n onClick={handleToggleModal}\n onFocus={handleFocus}\n padding={3}\n ref={inputRef}\n text={position ? 'Edit' : 'Set location'}\n />\n\n {position && (\n <Button\n disabled={readOnly}\n icon={TrashIcon}\n mode=\"ghost\"\n onClick={handleClear}\n padding={3}\n text=\"Remove\"\n tone=\"critical\"\n />\n )}\n </Grid>\n </Box>\n\n {modalOpen && (\n <Dialog\n header=\"Place the marker on the map\"\n id={`${dialogId}_dialog`}\n onBlur={handleBlur}\n onClose={handleCloseModal}\n ref={dialogRef}\n width={1}\n >\n <div className={dialogInnerContainer}>\n <APIProvider apiKey={config.apiKey}>\n <MapApiGate>\n <GeopointSelect\n value={value || undefined}\n onChange={readOnly ? undefined : handleChange}\n onZoomChange={readOnly || !config.saveZoom ? undefined : handleZoomChange}\n defaultLocation={config.defaultLocation}\n defaultZoom={value?.zoom || config.defaultZoom}\n />\n </MapApiGate>\n </APIProvider>\n </div>\n </Dialog>\n )}\n </Stack>","EMPTY_PATH","_c","_temp","{\n value,\n onChange,\n defaultLocation = defaultMapLocation,\n defaultRadiusZoom = 12,\n defaultRadius = 1000,\n}: SelectProps","defaultLocation = defaultMapLocation","defaultRadiusZoom = 12","defaultRadius = 1000","getValidLatLng(value)","{\n ...fallbackLatLng,\n ...defaultLocation,\n ...position,\n }","(latLng: LatLng, radius?: number) => {\n onChange?.(latLng, radius == null ? undefined : Math.round(radius))\n }","useCallback(\n (latLng: LatLng, radius?: number) => {\n onChange?.(latLng, radius == null ? undefined : Math.round(radius))\n },\n [onChange],\n )","(event: MapMouseEvent) => {\n if (event.detail.latLng) {\n setValue(event.detail.latLng, currentRadius)\n }\n }","useCallback(\n (event: MapMouseEvent) => {\n if (event.detail.latLng) {\n setValue(event.detail.latLng, currentRadius)\n }\n },\n [setValue, currentRadius],\n )","(event: google.maps.MapMouseEvent) => {\n if (event.latLng) {\n setValue({lat: event.latLng.lat(), lng: event.latLng.lng()}, currentRadius)\n }\n }","event","useCallback(\n (event: google.maps.MapMouseEvent) => {\n if (event.latLng) {\n setValue({lat: event.latLng.lat(), lng: event.latLng.lng()}, currentRadius)\n }\n },\n [setValue, currentRadius],\n )","(location: LatLng) => setValue(location, currentRadius)","useCallback(\n (location: LatLng) => setValue(location, currentRadius),\n [setValue, currentRadius],\n )","(radius: number) => {\n if (value) {\n setValue({lat: value.lat, lng: value.lng}, radius)\n }\n }","radius","useCallback(\n (radius: number) => {\n if (value) {\n setValue({lat: value.lat, lng: value.lng}, radius)\n }\n },\n [setValue, value],\n )","{width: '100%', height: '100%'}","<MapControl position={ControlPosition.TOP_RIGHT}>\n <SearchInput onSelect={handleSelect} />\n </MapControl>","position && (\n <>\n <AdvancedMarker\n position={position}\n draggable={Boolean(onChange)}\n onDragEnd={handleMarkerDragEnd}\n />\n <Circle\n center={position}\n radius={currentRadius}\n editable={Boolean(onChange)}\n draggable={Boolean(onChange)}\n fillColor=\"#4285F4\"\n fillOpacity={0.2}\n strokeColor=\"#4285F4\"\n strokeOpacity={0.8}\n strokeWeight={2}\n onRadiusChanged={handleCircleRadiusChanged}\n onDragEnd={handleCircleDragEnd}\n />\n </>\n )","<Map\n mapId={MAP_ID}\n defaultCenter={center}\n defaultZoom={defaultRadiusZoom}\n onClick={handleMapClick}\n gestureHandling=\"greedy\"\n streetViewControl={false}\n mapTypeControl={false}\n style={{width: '100%', height: '100%'}}\n >\n <MapControl position={ControlPosition.TOP_RIGHT}>\n <SearchInput onSelect={handleSelect} />\n </MapControl>\n {position && (\n <>\n <AdvancedMarker\n position={position}\n draggable={Boolean(onChange)}\n onDragEnd={handleMarkerDragEnd}\n />\n <Circle\n center={position}\n radius={currentRadius}\n editable={Boolean(onChange)}\n draggable={Boolean(onChange)}\n fillColor=\"#4285F4\"\n fillOpacity={0.2}\n strokeColor=\"#4285F4\"\n strokeOpacity={0.8}\n strokeWeight={2}\n onRadiusChanged={handleCircleRadiusChanged}\n onDragEnd={handleCircleDragEnd}\n />\n </>\n )}\n </Map>","_c","_Fragment","() => inputRef?.current?.focus()","inputRef?.current?.focus","useCallback(() => inputRef?.current?.focus(), [inputRef])","() => {\n if (dialogRef.current) dialogRef.current.blur()\n setModalOpen(false)\n handleFocusButton()\n }","useCallback(() => {\n if (dialogRef.current) dialogRef.current.blur()\n setModalOpen(false)\n handleFocusButton()\n }, [setModalOpen, handleFocusButton])","() => setModalOpen((currentState) => !currentState)","(currentState) => !currentState","useCallback(\n () => setModalOpen((currentState) => !currentState),\n [setModalOpen],\n )","(latLng: LatLng, radius?: number) => {\n const currentRadius = radius ?? value?.radius ?? config.defaultRadius ?? 1000\n onChange([\n setIfMissing({_type: schemaTypeName}),\n set(latLng.lat, ['lat']),\n set(latLng.lng, ['lng']),\n set(currentRadius, ['radius']),\n ])\n }","defaultRadius","radius","useCallback(\n (latLng: LatLng, radius?: number) => {\n const currentRadius = radius ?? value?.radius ?? config.defaultRadius ?? 1000\n onChange([\n setIfMissing({_type: schemaTypeName}),\n set(latLng.lat, ['lat']),\n set(latLng.lng, ['lng']),\n set(currentRadius, ['radius']),\n ])\n },\n [schemaTypeName, onChange, value?.radius, config.defaultRadius],\n )","(event: React.ChangeEvent<HTMLInputElement>) => {\n if (value) {\n onChange([set(Math.round(Number(event.currentTarget.value)), ['radius'])])\n }\n }","useCallback(\n (event: React.ChangeEvent<HTMLInputElement>) => {\n if (value) {\n onChange([set(Math.round(Number(event.currentTarget.value)), ['radius'])])\n }\n },\n [onChange, value],\n )","() => {\n onChange(unset())\n }","useCallback(() => {\n onChange(unset())\n }, [onChange])","() => {\n if (modalOpen) {\n onPathFocus(EMPTY_PATH)\n }\n }","[modalOpen, onPathFocus]","<MissingApiKeyCard typeTitle=\"Geopoint Radius\" />","position\n ? getGeopointRadiusStaticMapUrl(\n {lat: position.lat, lng: position.lng, radius: value?.radius ?? 0},\n config.apiKey,\n )\n : null","apiKey","Math.round(value?.radius || config.defaultRadius || 1000)","staticImageUrl && (\n <ChangeIndicator path={path} isChanged={changed} hasFocus={!!focused}>\n <StaticMapPreview\n url={staticImageUrl}\n onClick={handleFocusButton}\n onDoubleClick={handleToggleModal}\n />\n </ChangeIndicator>\n )","position && (\n <Stack gap={2}>\n <Label>Radius (meters)</Label>\n <TextInput\n type=\"number\"\n value={radius}\n onChange={handleRadiusChange}\n disabled={readOnly}\n min={1}\n max={50000}\n step={1}\n />\n </Stack>\n )","<Button\n aria-describedby={ariaDescribedBy}\n disabled={readOnly}\n icon={position ? EditIcon : undefined}\n id={id}\n mode=\"ghost\"\n onClick={handleToggleModal}\n onFocus={handleFocus}\n padding={3}\n ref={inputRef}\n text={position ? 'Edit' : 'Set location and radius'}\n />","position ? EditIcon : undefined","position ? 'Edit' : 'Set location and radius'","position && (\n <Button\n disabled={readOnly}\n icon={TrashIcon}\n mode=\"ghost\"\n onClick={handleClear}\n padding={3}\n text=\"Remove\"\n tone=\"critical\"\n />\n )","<Box>\n <Grid gridTemplateColumns={position ? 2 : 1} gap={3}>\n <Button\n aria-describedby={ariaDescribedBy}\n disabled={readOnly}\n icon={position ? EditIcon : undefined}\n id={id}\n mode=\"ghost\"\n onClick={handleToggleModal}\n onFocus={handleFocus}\n padding={3}\n ref={inputRef}\n text={position ? 'Edit' : 'Set location and radius'}\n />\n\n {position && (\n <Button\n disabled={readOnly}\n icon={TrashIcon}\n mode=\"ghost\"\n onClick={handleClear}\n padding={3}\n text=\"Remove\"\n tone=\"critical\"\n />\n )}\n </Grid>\n </Box>","position ? 2 : 1","modalOpen && (\n <Dialog\n header=\"Place the marker and set radius on the map\"\n id={`${dialogId}_dialog`}\n onBlur={handleBlur}\n onClose={handleCloseModal}\n ref={dialogRef}\n width={1}\n >\n <div className={dialogInnerContainer}>\n <APIProvider apiKey={config.apiKey}>\n <MapApiGate>\n <GeopointRadiusSelect\n value={value || undefined}\n onChange={readOnly ? undefined : handleChange}\n defaultLocation={config.defaultLocation}\n defaultRadiusZoom={config.defaultRadiusZoom}\n defaultRadius={config.defaultRadius}\n />\n </MapApiGate>\n </APIProvider>\n </div>\n </Dialog>\n )","defaultLocation","defaultRadiusZoom","<Stack gap={3}>\n {staticImageUrl && (\n <ChangeIndicator path={path} isChanged={changed} hasFocus={!!focused}>\n <StaticMapPreview\n url={staticImageUrl}\n onClick={handleFocusButton}\n onDoubleClick={handleToggleModal}\n />\n </ChangeIndicator>\n )}\n\n {position && (\n <Stack gap={2}>\n <Label>Radius (meters)</Label>\n <TextInput\n type=\"number\"\n value={radius}\n onChange={handleRadiusChange}\n disabled={readOnly}\n min={1}\n max={50000}\n step={1}\n />\n </Stack>\n )}\n\n <Box>\n <Grid gridTemplateColumns={position ? 2 : 1} gap={3}>\n <Button\n aria-describedby={ariaDescribedBy}\n disabled={readOnly}\n icon={position ? EditIcon : undefined}\n id={id}\n mode=\"ghost\"\n onClick={handleToggleModal}\n onFocus={handleFocus}\n padding={3}\n ref={inputRef}\n text={position ? 'Edit' : 'Set location and radius'}\n />\n\n {position && (\n <Button\n disabled={readOnly}\n icon={TrashIcon}\n mode=\"ghost\"\n onClick={handleClear}\n padding={3}\n text=\"Remove\"\n tone=\"critical\"\n />\n )}\n </Grid>\n </Box>\n\n {modalOpen && (\n <Dialog\n header=\"Place the marker and set radius on the map\"\n id={`${dialogId}_dialog`}\n onBlur={handleBlur}\n onClose={handleCloseModal}\n ref={dialogRef}\n width={1}\n >\n <div className={dialogInnerContainer}>\n <APIProvider apiKey={config.apiKey}>\n <MapApiGate>\n <GeopointRadiusSelect\n value={value || undefined}\n onChange={readOnly ? undefined : handleChange}\n defaultLocation={config.defaultLocation}\n defaultRadiusZoom={config.defaultRadiusZoom}\n defaultRadius={config.defaultRadius}\n />\n </MapApiGate>\n </APIProvider>\n </div>\n </Dialog>\n )}\n </Stack>","_c","castedProps","\"ref\"","\"onBlur\"","\"onFocus\""],"sources":["../src/map/staticMapUrl.ts","../src/diff/GeoConfigContext.tsx","../src/diff/StaticMapDiffPreview.css.ts","../src/diff/StaticMapDiffPreview.tsx","../src/diff/GeopointDiff.tsx","../src/input/ApiKeyMessages.tsx","../src/map/MapApiGate.tsx","../src/utils.ts","../src/map/constants.ts","../src/map/SearchInput.css.ts","../src/map/SearchInput.tsx","../src/input/GeopointSelect.tsx","../src/input/StaticMapPreview.css.ts","../src/input/StaticMapPreview.tsx","../src/input/GeopointInput.css.ts","../src/input/GeopointInput.tsx","../src/input/GeopointRadiusSelect.tsx","../src/input/GeopointRadiusInput.tsx","../src/plugin.tsx"],"sourcesContent":["import {createStaticMapsUrl, type StaticMapsLocation} from '@vis.gl/react-google-maps'\n\nimport type {Geopoint, GeopointRadius} from '../types'\n\nconst DEFAULT_WIDTH = 640\nconst DEFAULT_HEIGHT = 300\n// Rough meters-per-degree of latitude, used to translate a radius in meters to a\n// lat/lng delta. Good enough for previewing modest radii.\nconst METERS_PER_DEGREE = 111_000\n// Clamp the latitude cosine away from zero so the radius→longitude conversion\n// can't divide by ~0 near the poles and produce Infinity/NaN coordinates.\nconst MIN_LATITUDE_COSINE = 0.01\nconst CIRCLE_OUTLINE = '0x4285F4'\nconst CIRCLE_FILL = '0x4285F480'\n\n// Meters per degree of longitude at a given latitude (shrinks toward the poles).\nfunction lngMetersPerDegree(lat: number): number {\n return METERS_PER_DEGREE * Math.max(Math.cos((lat * Math.PI) / 180), MIN_LATITUDE_COSINE)\n}\n\nexport interface StaticMapSize {\n width?: number\n height?: number\n}\n\nconst DEFAULT_ZOOM = 13\n\ninterface GeopointStaticMapOptions extends StaticMapSize {\n /** Zoom level for the preview. Defaults to {@link DEFAULT_ZOOM}. */\n zoom?: number\n}\n\n/**\n * Static map preview for a plain geopoint: a single marker centered in view.\n */\nexport function getGeopointStaticMapUrl(\n value: Pick<Geopoint, 'lat' | 'lng'>,\n apiKey: string,\n {\n width = DEFAULT_WIDTH,\n height = DEFAULT_HEIGHT,\n zoom = DEFAULT_ZOOM,\n }: GeopointStaticMapOptions = {},\n): string {\n const center = {lat: value.lat, lng: value.lng}\n return createStaticMapsUrl({\n apiKey,\n width,\n height,\n scale: 2,\n zoom,\n center,\n markers: [{location: center}],\n })\n}\n\nfunction generateCirclePoints(lat: number, lng: number, radius: number): StaticMapsLocation[] {\n const points: StaticMapsLocation[] = []\n const steps = 64\n const latRatio = radius / METERS_PER_DEGREE\n const lngRatio = radius / lngMetersPerDegree(lat)\n\n for (let i = 0; i <= steps; i++) {\n const angle = (i / steps) * 2 * Math.PI\n points.push({\n lat: lat + latRatio * Math.cos(angle),\n lng: lng + lngRatio * Math.sin(angle),\n })\n }\n\n return points\n}\n\n// Extra room around the circle so it never sits flush against the image edge.\n// The Static Maps API only offers discrete zoom levels, so without padding a\n// circle can end up tangent to the border at certain radii.\nconst BOUNDS_PADDING = 1.15\n\n/**\n * The four cardinal extremes of the (padded) circle. Passing these as `visible`\n * lets the Static Maps API auto-fit the viewport around the whole circle —\n * with margin — instead of clipping it.\n */\nfunction getCircleBounds(lat: number, lng: number, radius: number): StaticMapsLocation[] {\n const padded = radius * BOUNDS_PADDING\n const latDelta = padded / METERS_PER_DEGREE\n const lngDelta = padded / lngMetersPerDegree(lat)\n return [\n {lat: lat + latDelta, lng},\n {lat: lat - latDelta, lng},\n {lat, lng: lng + lngDelta},\n {lat, lng: lng - lngDelta},\n ]\n}\n\n/**\n * Static map preview for a geopoint with a radius: a marker plus a filled circle.\n * The viewport is derived from the circle bounds (no fixed zoom) so the entire\n * radius stays within the image.\n */\nexport function getGeopointRadiusStaticMapUrl(\n value: Pick<GeopointRadius, 'lat' | 'lng' | 'radius'>,\n apiKey: string,\n {width = DEFAULT_WIDTH, height = DEFAULT_HEIGHT}: StaticMapSize = {},\n): string {\n if (!value.radius) {\n return getGeopointStaticMapUrl(value, apiKey, {width, height})\n }\n\n return createStaticMapsUrl({\n apiKey,\n width,\n height,\n scale: 2,\n markers: [{location: {lat: value.lat, lng: value.lng}}],\n paths: [\n {\n coordinates: generateCirclePoints(value.lat, value.lng, value.radius),\n color: CIRCLE_OUTLINE,\n weight: 2,\n fillcolor: CIRCLE_FILL,\n },\n ],\n visible: getCircleBounds(value.lat, value.lng, value.radius),\n })\n}\n","import {createContext} from 'react'\n\nimport type {GoogleMapsInputConfig} from '../types'\n\n/**\n * Diff components are resolved by the Studio outside of the form, so they can't\n * receive the plugin config as a prop the way the inputs do. The plugin installs\n * this provider at the Studio layout level so diff previews can read the API key.\n */\nexport const GoogleMapsInputContext = createContext<GoogleMapsInputConfig | null>(null)\nGoogleMapsInputContext.displayName = 'GoogleMapsInputContext'\n","import {style} from '@vanilla-extract/css'\n\nexport const mapDiffImage = style({\n display: 'block',\n width: '100%',\n height: 'auto',\n objectFit: 'contain',\n verticalAlign: 'top',\n})\n\nexport const mapDiffPlaceholder = style({\n width: '100%',\n minHeight: '80px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n})\n","import {ImageIcon} from '@sanity/icons/Image'\nimport {Flex, Text} from '@sanity/ui'\nimport {use, useState} from 'react'\n\nimport {getGeopointRadiusStaticMapUrl, getGeopointStaticMapUrl} from '../map/staticMapUrl'\nimport type {Geopoint, GeopointRadius} from '../types'\nimport {GoogleMapsInputContext} from './GeoConfigContext'\n\nimport {mapDiffImage, mapDiffPlaceholder} from './StaticMapDiffPreview.css'\n\ntype MapValue = Geopoint | GeopointRadius\n\nfunction hasRadius(value: MapValue): value is GeopointRadius {\n return typeof (value as GeopointRadius).radius === 'number'\n}\n\n/**\n * Renders the static map image for a single side of a geopoint/geopointRadius\n * diff. Used as the `previewComponent` for `DiffFromTo`, mirroring how the\n * built-in image diff shows a before/after thumbnail.\n */\nexport function StaticMapDiffPreview({value}: {value?: MapValue}) {\n const [failed, setFailed] = useState(false)\n const apiKey = use(GoogleMapsInputContext)?.apiKey\n\n if (!value || typeof value.lat !== 'number' || typeof value.lng !== 'number' || !apiKey) {\n return null\n }\n\n if (failed) {\n return (\n <div className={mapDiffPlaceholder}>\n <Flex align=\"center\" gap={2} justify=\"center\" padding={3}>\n <Text muted size={1}>\n <ImageIcon />\n </Text>\n <Text muted size={1}>\n Map preview unavailable\n </Text>\n </Flex>\n </div>\n )\n }\n\n const url = hasRadius(value)\n ? getGeopointRadiusStaticMapUrl(value, apiKey, {width: 500, height: 280})\n : getGeopointStaticMapUrl(value, apiKey, {width: 500, height: 280})\n\n return (\n <img\n className={mapDiffImage}\n alt=\"\"\n src={url}\n onError={() => setFailed(true)}\n height={280}\n width={500}\n />\n )\n}\n","import {DiffFromTo, type DiffProps, type ObjectDiff} from 'sanity'\n\nimport {StaticMapDiffPreview} from './StaticMapDiffPreview'\n\n/**\n * Diff component for `geopoint` and `geopointRadius` values. Renders a\n * before/after static map preview using `DiffFromTo`, matching the look of the\n * built-in image diff. Handles both types: the preview detects a `radius` field\n * and draws the radius circle when present.\n */\nexport function GeopointDiff({diff, schemaType}: DiffProps<ObjectDiff>) {\n return (\n <DiffFromTo\n diff={diff}\n schemaType={schemaType}\n previewComponent={StaticMapDiffPreview}\n layout=\"grid\"\n />\n )\n}\n","import {ErrorOutlineIcon} from '@sanity/icons/ErrorOutline'\nimport {WarningOutlineIcon} from '@sanity/icons/WarningOutline'\nimport {Box, Card, Flex, Stack, Text} from '@sanity/ui'\nimport {Code} from '@sanity/ui/code'\nimport type {ReactNode} from 'react'\n\nconst GET_API_KEY_URL = 'https://developers.google.com/maps/documentation/javascript/get-api-key'\nconst DEMO_KEY_URL = 'https://developers.google.com/maps/documentation/javascript/demo-key'\n\n// The APIs the key needs access to for the input to work end to end.\nconst REQUIRED_APIS = [\n 'Google Maps JavaScript API',\n 'Google Static Maps API',\n 'Google Places API (New)',\n] as const\n\nfunction RequiredApis() {\n return (\n <Box paddingLeft={3}>\n <Stack as=\"ul\" gap={2}>\n {REQUIRED_APIS.map((api) => (\n <Text key={api} as=\"li\" size={1} muted>\n {api}\n </Text>\n ))}\n </Stack>\n </Box>\n )\n}\n\nfunction MessageCard({\n tone,\n icon,\n title,\n children,\n}: {\n tone: 'caution' | 'critical'\n icon: ReactNode\n title: string\n children: ReactNode\n}) {\n return (\n <Card padding={4} radius={2} tone={tone} border>\n <Flex gap={3}>\n <Box flex=\"none\">\n <Text size={3}>{icon}</Text>\n </Box>\n <Stack flex={1} gap={4}>\n <Text size={1} weight=\"semibold\">\n {title}\n </Text>\n {children}\n </Stack>\n </Flex>\n </Card>\n )\n}\n\n/**\n * Shown when the plugin has not been given an API key. Explains how to provide\n * one in the plugin config and which Google APIs it needs.\n */\nexport function MissingApiKeyCard({typeTitle}: {typeTitle: string}) {\n return (\n <MessageCard tone=\"caution\" icon={<WarningOutlineIcon />} title=\"Google Maps API key required\">\n <Text size={1} muted>\n The {typeTitle} field uses Google Maps and needs an API key. Add one to the{' '}\n <code>googleMapsInput</code> plugin configuration:\n </Text>\n <Card padding={3} radius={2} tone=\"transparent\" border overflow=\"auto\">\n <Code size={1}>{`googleMapsInput({apiKey: 'your-api-key'})`}</Code>\n </Card>\n <Stack gap={3}>\n <Text size={1} muted>\n The key needs these APIs enabled:\n </Text>\n <RequiredApis />\n </Stack>\n <Text size={1} muted>\n <a href={GET_API_KEY_URL} target=\"_blank\" rel=\"noopener noreferrer\">\n Get an API key\n </a>\n {' · '}\n <a href={DEMO_KEY_URL} target=\"_blank\" rel=\"noopener noreferrer\">\n use a demo key to test\n </a>\n </Text>\n </MessageCard>\n )\n}\n\n/**\n * Shown when a key is configured but Google rejects the request (e.g. an\n * invalid/demo key, a restricted key, or one missing the required APIs).\n */\nexport function InvalidApiKeyCard() {\n return (\n <MessageCard tone=\"critical\" icon={<ErrorOutlineIcon />} title=\"Map preview couldn’t load\">\n <Text size={1} muted>\n The Google Maps API key was rejected. Check that it is a valid key — not a demo or\n placeholder key — that it is not restricted in a way that blocks this Studio’s URL, and that\n it has these APIs enabled:\n </Text>\n <RequiredApis />\n </MessageCard>\n )\n}\n","import {Flex, Spinner} from '@sanity/ui'\nimport {APILoadingStatus, useApiLoadingStatus} from '@vis.gl/react-google-maps'\nimport type {ReactNode} from 'react'\n\nimport {InvalidApiKeyCard} from '../input/ApiKeyMessages'\n\n/**\n * Renders the interactive map only once the Maps JavaScript API has loaded.\n * While loading it shows a spinner, and if the key is rejected it surfaces the\n * same \"invalid key\" guidance used by the static preview. Must be rendered\n * inside an `<APIProvider>`.\n */\nexport function MapApiGate({children}: {children: ReactNode}) {\n const status = useApiLoadingStatus()\n\n if (status === APILoadingStatus.AUTH_FAILURE || status === APILoadingStatus.FAILED) {\n return <InvalidApiKeyCard />\n }\n\n if (status !== APILoadingStatus.LOADED) {\n return (\n <Flex align=\"center\" justify=\"center\" height=\"fill\" padding={4}>\n <Spinner muted />\n </Flex>\n )\n }\n\n return <>{children}</>\n}\n","import type {LatLng} from './types'\n\n/**\n * Geopoint values can exist in a partial/empty state — a freshly added array\n * item is just `{_type, _key}` with no coordinates yet. Passing such a value's\n * `lat`/`lng` (which are `undefined`, or could be `NaN`/`Infinity`) to Google\n * Maps markers, circles or the map center throws an `InvalidValueError`. Use\n * this to extract a usable `LatLng` only when both coordinates are finite\n * numbers, and `null` otherwise.\n */\nexport function getValidLatLng(value: {lat?: number; lng?: number} | undefined): LatLng | null {\n const lat = value?.lat\n const lng = value?.lng\n if (\n typeof lat === 'number' &&\n Number.isFinite(lat) &&\n typeof lng === 'number' &&\n Number.isFinite(lng)\n ) {\n return {lat, lng}\n }\n return null\n}\n","/**\n * Advanced markers require a vector map, which in turn requires a map id.\n * `DEMO_MAP_ID` is Google's reserved id for trying advanced markers without\n * creating a cloud-based map style; it renders the default (red) marker.\n */\nexport const MAP_ID = 'DEMO_MAP_ID'\n","import {style} from '@vanilla-extract/css'\n\nexport const searchInput = style({\n margin: '10px',\n})\n","import {useMap, useMapsLibrary} from '@vis.gl/react-google-maps'\n\nimport type {LatLng} from '../types'\n\nimport {searchInput} from './SearchInput.css'\n\ninterface Props {\n onSelect: (location: LatLng) => void\n}\n\n/**\n * Place search using the `<gmp-place-autocomplete>` web component (Places API\n * New). The element is provided by the `places` library, so we wait for it to\n * load before rendering, then listen for the `gmp-select` event.\n */\nexport function SearchInput({onSelect}: Props) {\n const places = useMapsLibrary('places')\n const map = useMap()\n\n if (!places) {\n return null\n }\n\n return (\n <gmp-place-autocomplete\n className={searchInput}\n ongmp-select={async ({placePrediction}: google.maps.places.PlacePredictionSelectEvent) => {\n const place = placePrediction.toPlace()\n await place.fetchFields({fields: ['location']})\n\n const location = place.location\n if (!location) {\n return\n }\n\n const latLng = {lat: location.lat(), lng: location.lng()}\n onSelect(latLng)\n map?.panTo(latLng)\n }}\n />\n )\n}\n","import {\n AdvancedMarker,\n ControlPosition,\n Map,\n type MapCameraChangedEvent,\n type MapMouseEvent,\n MapControl,\n} from '@vis.gl/react-google-maps'\nimport {useCallback, useRef} from 'react'\n\nimport {MAP_ID} from '../map/constants'\nimport {SearchInput} from '../map/SearchInput'\nimport type {Geopoint, LatLng} from '../types'\nimport {getValidLatLng} from '../utils'\n\nconst fallbackLatLng: LatLng = {lat: 40.7058254, lng: -74.1180863}\nconst defaultMapLocation: LatLng = {lng: 10.74609, lat: 59.91273}\n\ninterface SelectProps {\n value?: Geopoint\n onChange?: (latLng: LatLng) => void\n onZoomChange?: (zoom: number) => void\n defaultLocation?: LatLng\n defaultZoom?: number\n}\n\nexport function GeopointSelect({\n value,\n onChange,\n onZoomChange,\n defaultLocation = defaultMapLocation,\n defaultZoom = 8,\n}: SelectProps) {\n const position = getValidLatLng(value)\n const center: LatLng = {\n ...fallbackLatLng,\n ...defaultLocation,\n ...position,\n }\n\n // Seed with the zoom the map opens at so the initial `zoom_changed` the Maps\n // API emits on load doesn't write a value before the user interacts. Only\n // genuine, distinct integer zoom levels get persisted.\n const lastZoomRef = useRef(Math.round(defaultZoom))\n\n const handleMapClick = useCallback(\n (event: MapMouseEvent) => {\n if (event.detail.latLng && onChange) {\n onChange(event.detail.latLng)\n }\n },\n [onChange],\n )\n\n const handleMarkerDragEnd = useCallback(\n (event: google.maps.MapMouseEvent) => {\n if (event.latLng && onChange) {\n onChange({lat: event.latLng.lat(), lng: event.latLng.lng()})\n }\n },\n [onChange],\n )\n\n const handleSelect = useCallback(\n (location: LatLng) => {\n onChange?.(location)\n },\n [onChange],\n )\n\n const handleZoomChanged = useCallback(\n (event: MapCameraChangedEvent) => {\n if (!onZoomChange) return\n const zoom = Math.round(event.detail.zoom)\n if (zoom !== lastZoomRef.current) {\n lastZoomRef.current = zoom\n onZoomChange(zoom)\n }\n },\n [onZoomChange],\n )\n\n return (\n <Map\n mapId={MAP_ID}\n defaultCenter={center}\n defaultZoom={defaultZoom}\n onClick={handleMapClick}\n onZoomChanged={onZoomChange ? handleZoomChanged : undefined}\n gestureHandling=\"greedy\"\n streetViewControl={false}\n mapTypeControl={false}\n style={{width: '100%', height: '100%'}}\n >\n <MapControl position={ControlPosition.TOP_RIGHT}>\n <SearchInput onSelect={handleSelect} />\n </MapControl>\n {position && (\n <AdvancedMarker\n position={position}\n draggable={Boolean(onChange)}\n onDragEnd={handleMarkerDragEnd}\n />\n )}\n </Map>\n )\n}\n","import {style} from '@vanilla-extract/css'\n\nexport const staticMapContainer = style({\n cursor: 'pointer',\n})\nexport const staticMapImage = style({\n width: '100%',\n height: 'auto',\n display: 'block',\n verticalAlign: 'top',\n})\n","import {StaticMap} from '@vis.gl/react-google-maps'\nimport {useState} from 'react'\n\nimport {InvalidApiKeyCard} from './ApiKeyMessages'\n\nimport {staticMapContainer, staticMapImage} from './StaticMapPreview.css'\n\ninterface StaticMapPreviewProps {\n url: string\n onClick?: () => void\n onDoubleClick?: () => void\n}\n\n/**\n * Renders the Google Static Maps preview (via the library's `StaticMap`). If\n * the image is rejected (invalid/demo key, restricted, or missing Static Maps\n * API access) the broken image is replaced with a helpful error card.\n */\nexport function StaticMapPreview({url, onClick, onDoubleClick}: StaticMapPreviewProps) {\n const [failed, setFailed] = useState(false)\n\n if (failed) {\n return <InvalidApiKeyCard />\n }\n\n return (\n // oxlint-disable-next-line jsx-a11y/click-events-have-key-events,jsx-a11y/no-static-element-interactions\n <div\n className={staticMapContainer}\n onClick={onClick}\n onDoubleClick={onDoubleClick}\n onErrorCapture={() => setFailed(true)}\n >\n <StaticMap className={staticMapImage} url={url} />\n </div>\n )\n}\n","import {style} from '@vanilla-extract/css'\n\nexport const dialogInnerContainer = style({\n height: '40rem',\n})\n","import {EditIcon} from '@sanity/icons/Edit'\nimport {TrashIcon} from '@sanity/icons/Trash'\nimport {Box, Button, Dialog, Grid, Stack} from '@sanity/ui'\nimport {APIProvider} from '@vis.gl/react-google-maps'\nimport {useCallback, useEffect, useId, useRef, useState} from 'react'\nimport {type ObjectInputProps, set, setIfMissing, unset, ChangeIndicator, type Path} from 'sanity'\n\nimport {MapApiGate} from '../map/MapApiGate'\nimport {getGeopointStaticMapUrl} from '../map/staticMapUrl'\nimport type {Geopoint, GoogleMapsInputConfig, LatLng} from '../types'\nimport {getValidLatLng} from '../utils'\nimport {MissingApiKeyCard} from './ApiKeyMessages'\nimport {GeopointSelect} from './GeopointSelect'\nimport {StaticMapPreview} from './StaticMapPreview'\n\nimport {dialogInnerContainer} from './GeopointInput.css'\n\nconst EMPTY_PATH: Path = []\n\nexport type GeopointInputProps = ObjectInputProps<Geopoint> & {\n geoConfig: GoogleMapsInputConfig\n}\n\nexport function GeopointInput(props: GeopointInputProps) {\n const {\n changed,\n elementProps,\n focused,\n geoConfig: config,\n onChange,\n onPathFocus,\n path,\n readOnly,\n schemaType,\n value,\n } = props\n\n const {\n id,\n 'ref': inputRef,\n 'onBlur': handleBlur,\n 'onFocus': handleFocus,\n 'aria-describedby': ariaDescribedBy,\n } = elementProps\n\n const schemaTypeName = schemaType.name\n const dialogId = useId()\n const dialogRef = useRef<HTMLDivElement | null>(null)\n const handleFocusButton = useCallback(() => inputRef?.current?.focus(), [inputRef])\n const [modalOpen, setModalOpen] = useState(false)\n\n const handleCloseModal = useCallback(() => {\n if (dialogRef.current) dialogRef.current.blur()\n setModalOpen(false)\n handleFocusButton()\n }, [setModalOpen, handleFocusButton])\n\n const handleToggleModal = useCallback(\n () => setModalOpen((currentState) => !currentState),\n [setModalOpen],\n )\n\n const handleChange = useCallback(\n (latLng: LatLng) => {\n onChange([\n setIfMissing({_type: schemaTypeName}),\n set(latLng.lat, ['lat']),\n set(latLng.lng, ['lng']),\n ])\n },\n [schemaTypeName, onChange],\n )\n\n const handleZoomChange = useCallback(\n (zoom: number) => {\n onChange([setIfMissing({_type: schemaTypeName}), set(zoom, ['zoom'])])\n },\n [schemaTypeName, onChange],\n )\n\n const handleClear = useCallback(() => {\n onChange(unset())\n }, [onChange])\n\n useEffect(() => {\n if (modalOpen) {\n onPathFocus(EMPTY_PATH)\n }\n }, [modalOpen, onPathFocus])\n\n if (!config || !config.apiKey) {\n return <MissingApiKeyCard typeTitle=\"Geopoint\" />\n }\n\n // A geopoint is only renderable on a map once it has finite coordinates. A\n // freshly added array item is `{_type, _key}` with no lat/lng yet, so gate the\n // map preview and \"edit\" affordances on having a real location.\n const position = getValidLatLng(value)\n const staticImageUrl = position\n ? getGeopointStaticMapUrl(position, config.apiKey, {zoom: value?.zoom})\n : null\n\n return (\n <Stack gap={3}>\n {staticImageUrl && (\n <ChangeIndicator path={path} isChanged={changed} hasFocus={!!focused}>\n <StaticMapPreview\n url={staticImageUrl}\n onClick={handleFocusButton}\n onDoubleClick={handleToggleModal}\n />\n </ChangeIndicator>\n )}\n\n <Box>\n <Grid gridTemplateColumns={position ? 2 : 1} gap={3}>\n <Button\n aria-describedby={ariaDescribedBy}\n disabled={readOnly}\n icon={position ? EditIcon : undefined}\n id={id}\n mode=\"ghost\"\n onClick={handleToggleModal}\n onFocus={handleFocus}\n padding={3}\n ref={inputRef}\n text={position ? 'Edit' : 'Set location'}\n />\n\n {position && (\n <Button\n disabled={readOnly}\n icon={TrashIcon}\n mode=\"ghost\"\n onClick={handleClear}\n padding={3}\n text=\"Remove\"\n tone=\"critical\"\n />\n )}\n </Grid>\n </Box>\n\n {modalOpen && (\n <Dialog\n header=\"Place the marker on the map\"\n id={`${dialogId}_dialog`}\n onBlur={handleBlur}\n onClose={handleCloseModal}\n ref={dialogRef}\n width={1}\n >\n <div className={dialogInnerContainer}>\n <APIProvider apiKey={config.apiKey}>\n <MapApiGate>\n <GeopointSelect\n value={value || undefined}\n onChange={readOnly ? undefined : handleChange}\n onZoomChange={readOnly || !config.saveZoom ? undefined : handleZoomChange}\n defaultLocation={config.defaultLocation}\n defaultZoom={value?.zoom || config.defaultZoom}\n />\n </MapApiGate>\n </APIProvider>\n </div>\n </Dialog>\n )}\n </Stack>\n )\n}\n","import {\n AdvancedMarker,\n Circle,\n ControlPosition,\n Map,\n type MapMouseEvent,\n MapControl,\n} from '@vis.gl/react-google-maps'\nimport {useCallback} from 'react'\n\nimport {MAP_ID} from '../map/constants'\nimport {SearchInput} from '../map/SearchInput'\nimport type {GeopointRadius, LatLng} from '../types'\nimport {getValidLatLng} from '../utils'\n\nconst fallbackLatLng: LatLng = {lat: 40.7058254, lng: -74.1180863}\nconst defaultMapLocation: LatLng = {lng: 10.74609, lat: 59.91273}\n\ninterface SelectProps {\n value?: GeopointRadius\n onChange?: (latLng: LatLng, radius?: number) => void\n defaultLocation?: LatLng\n defaultRadiusZoom?: number\n defaultRadius?: number\n}\n\nexport function GeopointRadiusSelect({\n value,\n onChange,\n defaultLocation = defaultMapLocation,\n defaultRadiusZoom = 12,\n defaultRadius = 1000,\n}: SelectProps) {\n const position = getValidLatLng(value)\n const center: LatLng = {\n ...fallbackLatLng,\n ...defaultLocation,\n ...position,\n }\n const currentRadius = value?.radius ?? defaultRadius\n\n const setValue = useCallback(\n (latLng: LatLng, radius?: number) => {\n onChange?.(latLng, radius == null ? undefined : Math.round(radius))\n },\n [onChange],\n )\n\n const handleMapClick = useCallback(\n (event: MapMouseEvent) => {\n if (event.detail.latLng) {\n setValue(event.detail.latLng, currentRadius)\n }\n },\n [setValue, currentRadius],\n )\n\n const handleMarkerDragEnd = useCallback(\n (event: google.maps.MapMouseEvent) => {\n if (event.latLng) {\n setValue({lat: event.latLng.lat(), lng: event.latLng.lng()}, currentRadius)\n }\n },\n [setValue, currentRadius],\n )\n\n const handleSelect = useCallback(\n (location: LatLng) => setValue(location, currentRadius),\n [setValue, currentRadius],\n )\n\n const handleCircleRadiusChanged = useCallback(\n (radius: number) => {\n if (value) {\n setValue({lat: value.lat, lng: value.lng}, radius)\n }\n },\n [setValue, value],\n )\n\n const handleCircleDragEnd = useCallback(\n (event: google.maps.MapMouseEvent) => {\n if (event.latLng) {\n setValue({lat: event.latLng.lat(), lng: event.latLng.lng()}, currentRadius)\n }\n },\n [setValue, currentRadius],\n )\n\n return (\n <Map\n mapId={MAP_ID}\n defaultCenter={center}\n defaultZoom={defaultRadiusZoom}\n onClick={handleMapClick}\n gestureHandling=\"greedy\"\n streetViewControl={false}\n mapTypeControl={false}\n style={{width: '100%', height: '100%'}}\n >\n <MapControl position={ControlPosition.TOP_RIGHT}>\n <SearchInput onSelect={handleSelect} />\n </MapControl>\n {position && (\n <>\n <AdvancedMarker\n position={position}\n draggable={Boolean(onChange)}\n onDragEnd={handleMarkerDragEnd}\n />\n <Circle\n center={position}\n radius={currentRadius}\n editable={Boolean(onChange)}\n draggable={Boolean(onChange)}\n fillColor=\"#4285F4\"\n fillOpacity={0.2}\n strokeColor=\"#4285F4\"\n strokeOpacity={0.8}\n strokeWeight={2}\n onRadiusChanged={handleCircleRadiusChanged}\n onDragEnd={handleCircleDragEnd}\n />\n </>\n )}\n </Map>\n )\n}\n","import {EditIcon} from '@sanity/icons/Edit'\nimport {TrashIcon} from '@sanity/icons/Trash'\nimport {Box, Button, Dialog, Grid, Stack, TextInput, Label} from '@sanity/ui'\nimport {APIProvider} from '@vis.gl/react-google-maps'\nimport {useCallback, useEffect, useId, useRef, useState} from 'react'\nimport {type ObjectInputProps, set, setIfMissing, unset, ChangeIndicator, type Path} from 'sanity'\n\nimport {MapApiGate} from '../map/MapApiGate'\nimport {getGeopointRadiusStaticMapUrl} from '../map/staticMapUrl'\nimport type {GeopointRadius, GoogleMapsInputConfig, LatLng} from '../types'\nimport {getValidLatLng} from '../utils'\nimport {MissingApiKeyCard} from './ApiKeyMessages'\nimport {GeopointRadiusSelect} from './GeopointRadiusSelect'\nimport {StaticMapPreview} from './StaticMapPreview'\n\nimport {dialogInnerContainer} from './GeopointInput.css'\n\nconst EMPTY_PATH: Path = []\n\nexport type GeopointRadiusInputProps = ObjectInputProps<GeopointRadius> & {\n geoConfig: GoogleMapsInputConfig\n}\n\nexport function GeopointRadiusInput(props: GeopointRadiusInputProps) {\n const {\n changed,\n elementProps,\n focused,\n geoConfig: config,\n onChange,\n onPathFocus,\n path,\n readOnly,\n schemaType,\n value,\n } = props\n\n const {\n id,\n 'ref': inputRef,\n 'onBlur': handleBlur,\n 'onFocus': handleFocus,\n 'aria-describedby': ariaDescribedBy,\n } = elementProps\n\n const schemaTypeName = schemaType.name\n const dialogId = useId()\n const dialogRef = useRef<HTMLDivElement | null>(null)\n const handleFocusButton = useCallback(() => inputRef?.current?.focus(), [inputRef])\n const [modalOpen, setModalOpen] = useState(false)\n\n const handleCloseModal = useCallback(() => {\n if (dialogRef.current) dialogRef.current.blur()\n setModalOpen(false)\n handleFocusButton()\n }, [setModalOpen, handleFocusButton])\n\n const handleToggleModal = useCallback(\n () => setModalOpen((currentState) => !currentState),\n [setModalOpen],\n )\n\n const handleChange = useCallback(\n (latLng: LatLng, radius?: number) => {\n const currentRadius = radius ?? value?.radius ?? config.defaultRadius ?? 1000\n onChange([\n setIfMissing({_type: schemaTypeName}),\n set(latLng.lat, ['lat']),\n set(latLng.lng, ['lng']),\n set(currentRadius, ['radius']),\n ])\n },\n [schemaTypeName, onChange, value?.radius, config.defaultRadius],\n )\n\n const handleRadiusChange = useCallback(\n (event: React.ChangeEvent<HTMLInputElement>) => {\n if (value) {\n onChange([set(Math.round(Number(event.currentTarget.value)), ['radius'])])\n }\n },\n [onChange, value],\n )\n\n const handleClear = useCallback(() => {\n onChange(unset())\n }, [onChange])\n\n useEffect(() => {\n if (modalOpen) {\n onPathFocus(EMPTY_PATH)\n }\n }, [modalOpen, onPathFocus])\n\n if (!config || !config.apiKey) {\n return <MissingApiKeyCard typeTitle=\"Geopoint Radius\" />\n }\n\n // A geopoint is only renderable on a map once it has finite coordinates. A\n // freshly added array item is `{_type, _key}` with no lat/lng yet, so gate the\n // map preview, radius control and \"edit\" affordances on having a real location.\n const position = getValidLatLng(value)\n const radius = Math.round(value?.radius || config.defaultRadius || 1000)\n const staticImageUrl = position\n ? getGeopointRadiusStaticMapUrl(\n {lat: position.lat, lng: position.lng, radius: value?.radius ?? 0},\n config.apiKey,\n )\n : null\n\n return (\n <Stack gap={3}>\n {staticImageUrl && (\n <ChangeIndicator path={path} isChanged={changed} hasFocus={!!focused}>\n <StaticMapPreview\n url={staticImageUrl}\n onClick={handleFocusButton}\n onDoubleClick={handleToggleModal}\n />\n </ChangeIndicator>\n )}\n\n {position && (\n <Stack gap={2}>\n <Label>Radius (meters)</Label>\n <TextInput\n type=\"number\"\n value={radius}\n onChange={handleRadiusChange}\n disabled={readOnly}\n min={1}\n max={50000}\n step={1}\n />\n </Stack>\n )}\n\n <Box>\n <Grid gridTemplateColumns={position ? 2 : 1} gap={3}>\n <Button\n aria-describedby={ariaDescribedBy}\n disabled={readOnly}\n icon={position ? EditIcon : undefined}\n id={id}\n mode=\"ghost\"\n onClick={handleToggleModal}\n onFocus={handleFocus}\n padding={3}\n ref={inputRef}\n text={position ? 'Edit' : 'Set location and radius'}\n />\n\n {position && (\n <Button\n disabled={readOnly}\n icon={TrashIcon}\n mode=\"ghost\"\n onClick={handleClear}\n padding={3}\n text=\"Remove\"\n tone=\"critical\"\n />\n )}\n </Grid>\n </Box>\n\n {modalOpen && (\n <Dialog\n header=\"Place the marker and set radius on the map\"\n id={`${dialogId}_dialog`}\n onBlur={handleBlur}\n onClose={handleCloseModal}\n ref={dialogRef}\n width={1}\n >\n <div className={dialogInnerContainer}>\n <APIProvider apiKey={config.apiKey}>\n <MapApiGate>\n <GeopointRadiusSelect\n value={value || undefined}\n onChange={readOnly ? undefined : handleChange}\n defaultLocation={config.defaultLocation}\n defaultRadiusZoom={config.defaultRadiusZoom}\n defaultRadius={config.defaultRadius}\n />\n </MapApiGate>\n </APIProvider>\n </div>\n </Dialog>\n )}\n </Stack>\n )\n}\n","import {definePlugin, type SchemaType} from 'sanity'\n\nimport {GoogleMapsInputContext} from './diff/GeoConfigContext'\nimport {GeopointDiff} from './diff/GeopointDiff'\nimport {GeopointInput, type GeopointInputProps} from './input/GeopointInput'\nimport {GeopointRadiusInput, type GeopointRadiusInputProps} from './input/GeopointRadiusInput'\nimport type {GeopointSchemaType, GeopointRadiusSchemaType, GoogleMapsInputConfig} from './types'\n\nexport const googleMapsInput = definePlugin<GoogleMapsInputConfig>((config) => {\n return {\n name: 'google-maps-input',\n studio: {\n components: {\n // Make the config (API key) available to diff components, which are\n // resolved outside of the form and so can't receive it as a prop.\n activeToolLayout: function GoogleMapsInputContextProvider(props) {\n return (\n <GoogleMapsInputContext value={config}>\n {props.renderDefault(props)}\n </GoogleMapsInputContext>\n )\n },\n },\n },\n schema: {\n types: [\n {\n name: 'geopointRadius',\n title: 'Geopoint with Radius',\n type: 'object',\n // Only attach the map diff when there's a key to render it with;\n // otherwise fall back to the default per-field (lat/lng/radius) diff.\n components: config.apiKey ? {diff: GeopointDiff} : undefined,\n fields: [\n {\n name: 'lat',\n title: 'Latitude',\n type: 'number',\n validation: (Rule) => Rule.required().min(-90).max(90),\n },\n {\n name: 'lng',\n title: 'Longitude',\n type: 'number',\n validation: (Rule) => Rule.required().min(-180).max(180),\n },\n {\n name: 'alt',\n title: 'Altitude',\n type: 'number',\n },\n {\n name: 'radius',\n title: 'Radius (meters)',\n type: 'number',\n validation: (Rule) => Rule.required().min(1).max(50000),\n },\n ],\n preview: {\n select: {\n lat: 'lat',\n lng: 'lng',\n radius: 'radius',\n },\n prepare({lat, lng, radius}: {lat?: number; lng?: number; radius?: number}) {\n return {\n title:\n typeof lat === 'number' && typeof lng === 'number'\n ? `${lat.toFixed(6)}, ${lng.toFixed(6)}`\n : 'No location set',\n subtitle: radius ? `Radius: ${radius}m` : 'No radius set',\n }\n },\n },\n },\n ],\n },\n form: {\n components: {\n input(props) {\n if (isGeopoint(props.schemaType)) {\n const castedProps = props as unknown as Omit<GeopointInputProps, 'geoConfig'>\n return <GeopointInput {...castedProps} geoConfig={config} />\n }\n if (isGeopointRadius(props.schemaType)) {\n const castedProps = props as unknown as Omit<GeopointRadiusInputProps, 'geoConfig'>\n return <GeopointRadiusInput {...castedProps} geoConfig={config} />\n }\n return props.renderDefault(props)\n },\n },\n },\n }\n})\n\nfunction isGeopoint(schemaType: SchemaType): schemaType is GeopointSchemaType {\n return isType('geopoint', schemaType)\n}\n\nfunction isGeopointRadius(schemaType: SchemaType): schemaType is GeopointRadiusSchemaType {\n return isType('geopointRadius', schemaType)\n}\n\nfunction isType(name: string, schema?: SchemaType): boolean {\n if (schema?.name === name) {\n return true\n } else if (!schema?.name) {\n return false\n }\n return isType(name, schema?.type)\n}\n"],"mappings":"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"}
\ No newline at end of file Index: package/dist/index.d.ts
===================================================================
--- package/dist/index.d.ts
+++ package/dist/index.d.ts
@@ -5,9 +5,9 @@
* before/after static map preview using `DiffFromTo`, matching the look of the
* built-in image diff. Handles both types: the preview detects a `radius` field
* and draws the radius circle when present.
*/
-declare function GeopointDiff({ diff, schemaType }: DiffProps<ObjectDiff>): import("react").JSX.Element;
+export declare function GeopointDiff({ diff, schemaType }: DiffProps<ObjectDiff>): import("react").JSX.Element;
interface LatLng {
lat: number;
lng: number;
}
@@ -43,12 +43,12 @@
}
type GeopointInputProps = ObjectInputProps<Geopoint> & {
geoConfig: GoogleMapsInputConfig;
};
-declare function GeopointInput(props: GeopointInputProps): import("react").JSX.Element;
+export declare function GeopointInput(props: GeopointInputProps): import("react").JSX.Element;
type GeopointRadiusInputProps = ObjectInputProps<GeopointRadius> & {
geoConfig: GoogleMapsInputConfig;
};
-declare function GeopointRadiusInput(props: GeopointRadiusInputProps): import("react").JSX.Element;
-declare const googleMapsInput: import("sanity").Plugin<GoogleMapsInputConfig>;
-export { type Geopoint, GeopointDiff, GeopointInput, type GeopointInputProps, type GeopointRadius, GeopointRadiusInput, type GeopointRadiusInputProps, type GeopointRadiusSchemaType, type GeopointSchemaType, type GoogleMapsInputConfig, type LatLng, googleMapsInput };
+export declare function GeopointRadiusInput(props: GeopointRadiusInputProps): import("react").JSX.Element;
+export declare const googleMapsInput: import("sanity").Plugin<GoogleMapsInputConfig>;
+export type { Geopoint, GeopointInputProps, GeopointRadius, GeopointRadiusInputProps, GeopointRadiusSchemaType, GeopointSchemaType, GoogleMapsInputConfig, LatLng };
//# sourceMappingURL=index.d.ts.map
\ No newline at end of file