@sanity/google-maps-input 6.0.1 → 6.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -100,6 +100,35 @@ The `geopointRadius` field type extends the basic geopoint with:
100
100
  - Editable radius input field
101
101
  - Draggable circle for radius adjustment
102
102
 
103
+ ### Store selected Zoom
104
+
105
+ Optionally persists the selected zoom level on the `geopoint` object.
106
+
107
+ ```js
108
+ import {googleMapsInput} from '@sanity/google-maps-input'
109
+
110
+ export default defineConfig({
111
+ // ...
112
+ plugins: [
113
+ googleMapsInput({
114
+ apiKey: 'my-api-key',
115
+ saveZoom: true, // default false
116
+ }),
117
+ ],
118
+ })
119
+ ```
120
+
121
+ Adds a `zoom` property to the `geopoint` object:
122
+
123
+ ```json
124
+ {
125
+ "_type": "geopoint",
126
+ "lat": 54.5259614,
127
+ "lng": 15.2551187,
128
+ "zoom": 3
129
+ }
130
+ ```
131
+
103
132
  ### Reviewing changes
104
133
 
105
134
  In the document's **Review changes** pane, `geopoint` and `geopointRadius` values render as a before/after static map preview, matching the look of the built-in image diff.
@@ -0,0 +1,2 @@
1
+ ._7uupx50{object-fit:contain;vertical-align:top;width:100%;height:auto;display:block}._7uupx51{justify-content:center;align-items:center;width:100%;min-height:80px;display:flex}._1aoq8p40{margin:10px}.nbnf7q0{cursor:pointer}.nbnf7q1{vertical-align:top;width:100%;height:auto;display:block}.b5c1gf0{height:40rem}
2
+ /*# sourceMappingURL=bundle.css.map*/
@@ -0,0 +1,3 @@
1
+ // Type declarations for `bundle.css` and its no-op JS shim.
2
+ declare const _default: string
3
+ export default _default
@@ -0,0 +1,2 @@
1
+ // No-op shim for `bundle.css` in runtimes that cannot import `.css` files directly.
2
+ export default ""
@@ -0,0 +1 @@
1
+ {"version":3,"sourceRoot":null,"mappings":"ACAA,qFAOA,4FCPA,uBCAA,wBAGA,iECHA","sources":["bundle.css","src/diff/StaticMapDiffPreview.css.ts.vanilla.css","src/map/SearchInput.css.ts.vanilla.css","src/input/StaticMapPreview.css.ts.vanilla.css","src/input/GeopointInput.css.ts.vanilla.css"],"sourcesContent":["._7uupx50 {\n display: block;\n width: 100%;\n height: auto;\n object-fit: contain;\n vertical-align: top;\n}\n._7uupx51 {\n width: 100%;\n min-height: 80px;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n._1aoq8p40 {\n margin: 10px;\n}\n.nbnf7q0 {\n cursor: pointer;\n}\n.nbnf7q1 {\n width: 100%;\n height: auto;\n display: block;\n vertical-align: top;\n}\n.b5c1gf0 {\n height: 40rem;\n}","._7uupx50 {\n display: block;\n width: 100%;\n height: auto;\n object-fit: contain;\n vertical-align: top;\n}\n._7uupx51 {\n width: 100%;\n min-height: 80px;\n display: flex;\n align-items: center;\n justify-content: center;\n}","._1aoq8p40 {\n margin: 10px;\n}",".nbnf7q0 {\n cursor: pointer;\n}\n.nbnf7q1 {\n width: 100%;\n height: auto;\n display: block;\n vertical-align: top;\n}",".b5c1gf0 {\n height: 40rem;\n}"],"names":[]}
package/dist/index.d.ts CHANGED
@@ -19,6 +19,7 @@ interface Geopoint {
19
19
  lat: number;
20
20
  lng: number;
21
21
  alt?: number;
22
+ zoom?: number;
22
23
  }
23
24
  interface GeopointRadius {
24
25
  _type: 'geopointRadius';
@@ -34,6 +35,7 @@ interface GoogleMapsInputConfig {
34
35
  apiKey: string;
35
36
  defaultZoom?: number;
36
37
  defaultLocale?: string;
38
+ saveZoom?: boolean;
37
39
  defaultLocation?: {
38
40
  lat: number;
39
41
  lng: number;
@@ -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":";;AAUA;;;;;iBAAgB,YAAA;EAAc,IAAA;EAAM;AAAA,GAAa,SAAA,CAAU,UAAA,oBAAW,GAAA,CAAA,OAAA;AAAA,UCRrD,MAAA;EACf,GAAA;EACA,GAAG;AAAA;AAAA,UAGY,QAAA;EACf,KAAA;EACA,IAAA;EACA,GAAA;EACA,GAAA;EACA,GAAA;AAAA;AAAA,UAGe,cAAA;EACf,KAAA;EACA,IAAA;EACA,GAAA;EACA,GAAA;EACA,GAAA;EACA,MAAA;AAAA;AAAA,KAGU,kBAAA,GAAqB,gBAAgB;AAAA,KAErC,wBAAA,GAA2B,gBAAgB;AAAA,UAEtC,qBAAA;EACf,MAAA;EACA,WAAA;EACA,aAAA;EACA,eAAA;IACE,GAAA;IACA,GAAA;EAAA;EAEF,iBAAA;EACA,aAAA;AAAA;AAAA,KCpBU,kBAAA,GAAqB,gBAAA,CAAiB,QAAA;EAChD,SAAA,EAAW,qBAAA;AAAA;AAAA,iBAGG,aAAA,CAAc,KAAA,EAAO,kBAAkB,mBAAA,GAAA,CAAA,OAAA;AAAA,KCJ3C,wBAAA,GAA2B,gBAAA,CAAiB,cAAA;EACtD,SAAA,EAAW,qBAAA;AAAA;AAAA,iBAGG,mBAAA,CAAoB,KAAA,EAAO,wBAAwB,mBAAA,GAAA,CAAA,OAAA;AAAA,cCbtD,eAAA,mBAAe,MAAA,CAAA,qBAAA"}
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":";;AAUA;;;;;iBAAgB,YAAA;EAAc,IAAA;EAAM;AAAA,GAAa,SAAA,CAAU,UAAA,oBAAW,GAAA,CAAA,OAAA;AAAA,UCRrD,MAAA;EACf,GAAA;EACA,GAAG;AAAA;AAAA,UAGY,QAAA;EACf,KAAA;EACA,IAAA;EACA,GAAA;EACA,GAAA;EACA,GAAA;EACA,IAAA;AAAA;AAAA,UAGe,cAAA;EACf,KAAA;EACA,IAAA;EACA,GAAA;EACA,GAAA;EACA,GAAA;EACA,MAAA;AAAA;AAAA,KAGU,kBAAA,GAAqB,gBAAgB;AAAA,KAErC,wBAAA,GAA2B,gBAAgB;AAAA,UAEtC,qBAAA;EACf,MAAA;EACA,WAAA;EACA,aAAA;EACA,QAAA;EACA,eAAA;IACE,GAAA;IACA,GAAA;EAAA;EAEF,iBAAA;EACA,aAAA;AAAA;AAAA,KCrBU,kBAAA,GAAqB,gBAAA,CAAiB,QAAA;EAChD,SAAA,EAAW,qBAAA;AAAA;AAAA,iBAGG,aAAA,CAAc,KAAA,EAAO,kBAAkB,mBAAA,GAAA,CAAA,OAAA;AAAA,KCJ3C,wBAAA,GAA2B,gBAAA,CAAiB,cAAA;EACtD,SAAA,EAAW,qBAAA;AAAA;AAAA,iBAGG,mBAAA,CAAoB,KAAA,EAAO,wBAAwB,mBAAA,GAAA,CAAA,OAAA;AAAA,cCdtD,eAAA,mBAAe,MAAA,CAAA,qBAAA"}
package/dist/index.js CHANGED
@@ -1,18 +1,20 @@
1
+ import "@sanity/google-maps-input/bundle.css";
1
2
  import { jsx, jsxs, Fragment } from "react/jsx-runtime";
2
3
  import { c } from "react/compiler-runtime";
3
4
  import { DiffFromTo, setIfMissing, set, unset, ChangeIndicator, definePlugin } from "sanity";
4
5
  import { ImageIcon, WarningOutlineIcon, ErrorOutlineIcon, EditIcon, TrashIcon } from "@sanity/icons";
5
6
  import { Flex, Text, Card, Box, Stack, Code, Spinner, Button, Grid, Dialog, Label, TextInput } from "@sanity/ui";
6
- import { createContext, useState, use, useId, useRef, useEffect } from "react";
7
+ import { createContext, useState, use, useRef, useId, useEffect } from "react";
7
8
  import { createStaticMapsUrl, useApiLoadingStatus, APILoadingStatus, useMapsLibrary, useMap, Map, MapControl, ControlPosition, AdvancedMarker, StaticMap, APIProvider, Circle } from "@vis.gl/react-google-maps";
8
- import { styled } from "styled-components";
9
9
  const DEFAULT_WIDTH = 640, DEFAULT_HEIGHT = 300, METERS_PER_DEGREE = 111e3, MIN_LATITUDE_COSINE = 0.01, CIRCLE_OUTLINE = "0x4285F4", CIRCLE_FILL = "0x4285F480";
10
10
  function lngMetersPerDegree(lat) {
11
11
  return METERS_PER_DEGREE * Math.max(Math.cos(lat * Math.PI / 180), MIN_LATITUDE_COSINE);
12
12
  }
13
+ const DEFAULT_ZOOM = 13;
13
14
  function getGeopointStaticMapUrl(value, apiKey, {
14
15
  width = DEFAULT_WIDTH,
15
- height = DEFAULT_HEIGHT
16
+ height = DEFAULT_HEIGHT,
17
+ zoom = DEFAULT_ZOOM
16
18
  } = {}) {
17
19
  const center = {
18
20
  lat: value.lat,
@@ -23,7 +25,7 @@ function getGeopointStaticMapUrl(value, apiKey, {
23
25
  width,
24
26
  height,
25
27
  scale: 2,
26
- zoom: 13,
28
+ zoom,
27
29
  center,
28
30
  markers: [{
29
31
  location: center
@@ -87,13 +89,7 @@ function getGeopointRadiusStaticMapUrl(value, apiKey, {
87
89
  }
88
90
  const GoogleMapsInputContext = createContext(null);
89
91
  GoogleMapsInputContext.displayName = "GoogleMapsInputContext";
90
- const MapDiffImage = styled.div.withConfig({
91
- displayName: "MapDiffImage",
92
- componentId: "sc-1uvj7r6-0"
93
- })`& img{display:block;width:100%;height:auto;object-fit:contain;vertical-align:top;}`, MapDiffPlaceholder = styled.div.withConfig({
94
- displayName: "MapDiffPlaceholder",
95
- componentId: "sc-1uvj7r6-1"
96
- })`width:100%;min-height:80px;display:flex;align-items:center;justify-content:center;`;
92
+ var mapDiffImage = "_7uupx50", mapDiffPlaceholder = "_7uupx51";
97
93
  function hasRadius(value) {
98
94
  return typeof value.radius == "number";
99
95
  }
@@ -105,7 +101,7 @@ function StaticMapDiffPreview(t0) {
105
101
  return null;
106
102
  if (failed) {
107
103
  let t12;
108
- return $[0] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (t12 = /* @__PURE__ */ jsx(MapDiffPlaceholder, { children: /* @__PURE__ */ jsxs(Flex, { align: "center", gap: 2, justify: "center", padding: 3, children: [
104
+ return $[0] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (t12 = /* @__PURE__ */ jsx("div", { className: mapDiffPlaceholder, children: /* @__PURE__ */ jsxs(Flex, { align: "center", gap: 2, justify: "center", padding: 3, children: [
109
105
  /* @__PURE__ */ jsx(Text, { muted: !0, size: 1, children: /* @__PURE__ */ jsx(ImageIcon, {}) }),
110
106
  /* @__PURE__ */ jsx(Text, { muted: !0, size: 1, children: "Map preview unavailable" })
111
107
  ] }) }), $[0] = t12) : t12 = $[0], t12;
@@ -122,7 +118,7 @@ function StaticMapDiffPreview(t0) {
122
118
  let t2;
123
119
  $[4] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (t2 = () => setFailed(!0), $[4] = t2) : t2 = $[4];
124
120
  let t3;
125
- return $[5] !== url ? (t3 = /* @__PURE__ */ jsx(MapDiffImage, { children: /* @__PURE__ */ jsx("img", { alt: "", src: url, onError: t2, height: 280, width: 500 }) }), $[5] = url, $[6] = t3) : t3 = $[6], t3;
121
+ return $[5] !== url ? (t3 = /* @__PURE__ */ jsx("img", { className: mapDiffImage, alt: "", src: url, onError: t2, height: 280, width: 500 }), $[5] = url, $[6] = t3) : t3 = $[6], t3;
126
122
  }
127
123
  function GeopointDiff(t0) {
128
124
  const $ = c(3), {
@@ -237,16 +233,8 @@ function getValidLatLng(value) {
237
233
  lng
238
234
  } : null;
239
235
  }
240
- const StaticMapContainer = styled.div.withConfig({
241
- displayName: "StaticMapContainer",
242
- componentId: "sc-10h92ni-0"
243
- })`cursor:pointer;& img{width:100%;height:auto;display:block;vertical-align:top;}`, DialogInnerContainer = styled.div.withConfig({
244
- displayName: "DialogInnerContainer",
245
- componentId: "sc-10h92ni-1"
246
- })`height:40rem;`, MAP_ID = "DEMO_MAP_ID", SearchInputContainer = styled.div.withConfig({
247
- displayName: "SearchInputContainer",
248
- componentId: "sc-n3m9ut-0"
249
- })`margin:10px;width:240px;& gmp-place-autocomplete{width:100%;}`;
236
+ const MAP_ID = "DEMO_MAP_ID";
237
+ var searchInput = "_1aoq8p40";
250
238
  function SearchInput(t0) {
251
239
  const $ = c(3), {
252
240
  onSelect
@@ -254,7 +242,7 @@ function SearchInput(t0) {
254
242
  if (!places)
255
243
  return null;
256
244
  let t1;
257
- return $[0] !== map || $[1] !== onSelect ? (t1 = /* @__PURE__ */ jsx(SearchInputContainer, { children: /* @__PURE__ */ jsx("gmp-place-autocomplete", { "ongmp-select": async (t2) => {
245
+ return $[0] !== map || $[1] !== onSelect ? (t1 = /* @__PURE__ */ jsx("gmp-place-autocomplete", { className: searchInput, "ongmp-select": async (t2) => {
258
246
  const {
259
247
  placePrediction
260
248
  } = t2, place = placePrediction.toPlace();
@@ -269,7 +257,7 @@ function SearchInput(t0) {
269
257
  lng: location.lng()
270
258
  };
271
259
  onSelect(latLng), map?.panTo(latLng);
272
- } }) }), $[0] = map, $[1] = onSelect, $[2] = t1) : t1 = $[2], t1;
260
+ } }), $[0] = map, $[1] = onSelect, $[2] = t1) : t1 = $[2], t1;
273
261
  }
274
262
  const fallbackLatLng$1 = {
275
263
  lat: 40.7058254,
@@ -279,9 +267,10 @@ const fallbackLatLng$1 = {
279
267
  lat: 59.91273
280
268
  };
281
269
  function GeopointSelect(t0) {
282
- const $ = c(24), {
270
+ const $ = c(29), {
283
271
  value,
284
272
  onChange,
273
+ onZoomChange,
285
274
  defaultLocation: t1,
286
275
  defaultZoom: t2
287
276
  } = t0, defaultLocation = t1 === void 0 ? defaultMapLocation$1 : t1, defaultZoom = t2 === void 0 ? 8 : t2;
@@ -296,38 +285,50 @@ function GeopointSelect(t0) {
296
285
  }, $[2] = defaultLocation, $[3] = position, $[4] = t4) : t4 = $[4];
297
286
  const center = t4;
298
287
  let t5;
299
- $[5] !== onChange ? (t5 = (event) => {
300
- event.detail.latLng && onChange && onChange(event.detail.latLng);
301
- }, $[5] = onChange, $[6] = t5) : t5 = $[6];
302
- const handleMapClick = t5;
288
+ $[5] !== defaultZoom ? (t5 = Math.round(defaultZoom), $[5] = defaultZoom, $[6] = t5) : t5 = $[6];
289
+ const lastZoomRef = useRef(t5);
303
290
  let t6;
304
- $[7] !== onChange ? (t6 = (event_0) => {
291
+ $[7] !== onChange ? (t6 = (event) => {
292
+ event.detail.latLng && onChange && onChange(event.detail.latLng);
293
+ }, $[7] = onChange, $[8] = t6) : t6 = $[8];
294
+ const handleMapClick = t6;
295
+ let t7;
296
+ $[9] !== onChange ? (t7 = (event_0) => {
305
297
  event_0.latLng && onChange && onChange({
306
298
  lat: event_0.latLng.lat(),
307
299
  lng: event_0.latLng.lng()
308
300
  });
309
- }, $[7] = onChange, $[8] = t6) : t6 = $[8];
310
- const handleMarkerDragEnd = t6;
311
- let t7;
312
- $[9] !== onChange ? (t7 = (location) => {
313
- onChange?.(location);
314
301
  }, $[9] = onChange, $[10] = t7) : t7 = $[10];
315
- const handleSelect = t7;
302
+ const handleMarkerDragEnd = t7;
316
303
  let t8;
317
- $[11] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (t8 = {
318
- width: "100%",
319
- height: "100%"
320
- }, $[11] = t8) : t8 = $[11];
304
+ $[11] !== onChange ? (t8 = (location) => {
305
+ onChange?.(location);
306
+ }, $[11] = onChange, $[12] = t8) : t8 = $[12];
307
+ const handleSelect = t8;
321
308
  let t9;
322
- $[12] !== handleSelect ? (t9 = /* @__PURE__ */ jsx(MapControl, { position: ControlPosition.TOP_RIGHT, children: /* @__PURE__ */ jsx(SearchInput, { onSelect: handleSelect }) }), $[12] = handleSelect, $[13] = t9) : t9 = $[13];
323
- let t10;
324
- $[14] !== handleMarkerDragEnd || $[15] !== onChange || $[16] !== position ? (t10 = position && /* @__PURE__ */ jsx(AdvancedMarker, { position, draggable: !!onChange, onDragEnd: handleMarkerDragEnd }), $[14] = handleMarkerDragEnd, $[15] = onChange, $[16] = position, $[17] = t10) : t10 = $[17];
309
+ $[13] !== onZoomChange ? (t9 = (event_1) => {
310
+ if (!onZoomChange)
311
+ return;
312
+ const zoom = Math.round(event_1.detail.zoom);
313
+ zoom !== lastZoomRef.current && (lastZoomRef.current = zoom, onZoomChange(zoom));
314
+ }, $[13] = onZoomChange, $[14] = t9) : t9 = $[14];
315
+ const t10 = onZoomChange ? t9 : void 0;
325
316
  let t11;
326
- return $[18] !== center || $[19] !== defaultZoom || $[20] !== handleMapClick || $[21] !== t10 || $[22] !== t9 ? (t11 = /* @__PURE__ */ jsxs(Map, { mapId: MAP_ID, defaultCenter: center, defaultZoom, onClick: handleMapClick, gestureHandling: "greedy", streetViewControl: !1, mapTypeControl: !1, style: t8, children: [
327
- t9,
328
- t10
329
- ] }), $[18] = center, $[19] = defaultZoom, $[20] = handleMapClick, $[21] = t10, $[22] = t9, $[23] = t11) : t11 = $[23], t11;
317
+ $[15] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (t11 = {
318
+ width: "100%",
319
+ height: "100%"
320
+ }, $[15] = t11) : t11 = $[15];
321
+ let t12;
322
+ $[16] !== handleSelect ? (t12 = /* @__PURE__ */ jsx(MapControl, { position: ControlPosition.TOP_RIGHT, children: /* @__PURE__ */ jsx(SearchInput, { onSelect: handleSelect }) }), $[16] = handleSelect, $[17] = t12) : t12 = $[17];
323
+ let t13;
324
+ $[18] !== handleMarkerDragEnd || $[19] !== onChange || $[20] !== position ? (t13 = position && /* @__PURE__ */ jsx(AdvancedMarker, { position, draggable: !!onChange, onDragEnd: handleMarkerDragEnd }), $[18] = handleMarkerDragEnd, $[19] = onChange, $[20] = position, $[21] = t13) : t13 = $[21];
325
+ let t14;
326
+ return $[22] !== center || $[23] !== defaultZoom || $[24] !== handleMapClick || $[25] !== t10 || $[26] !== t12 || $[27] !== t13 ? (t14 = /* @__PURE__ */ jsxs(Map, { mapId: MAP_ID, defaultCenter: center, defaultZoom, onClick: handleMapClick, onZoomChanged: t10, gestureHandling: "greedy", streetViewControl: !1, mapTypeControl: !1, style: t11, children: [
327
+ t12,
328
+ t13
329
+ ] }), $[22] = center, $[23] = defaultZoom, $[24] = handleMapClick, $[25] = t10, $[26] = t12, $[27] = t13, $[28] = t14) : t14 = $[28], t14;
330
330
  }
331
+ var staticMapContainer = "nbnf7q0", staticMapImage = "nbnf7q1";
331
332
  function StaticMapPreview(t0) {
332
333
  const $ = c(8), {
333
334
  url,
@@ -341,13 +342,14 @@ function StaticMapPreview(t0) {
341
342
  let t1;
342
343
  $[1] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (t1 = () => setFailed(!0), $[1] = t1) : t1 = $[1];
343
344
  let t2;
344
- $[2] !== url ? (t2 = /* @__PURE__ */ jsx(StaticMap, { url }), $[2] = url, $[3] = t2) : t2 = $[3];
345
+ $[2] !== url ? (t2 = /* @__PURE__ */ jsx(StaticMap, { className: staticMapImage, url }), $[2] = url, $[3] = t2) : t2 = $[3];
345
346
  let t3;
346
- return $[4] !== onClick || $[5] !== onDoubleClick || $[6] !== t2 ? (t3 = /* @__PURE__ */ jsx(StaticMapContainer, { onClick, onDoubleClick, onErrorCapture: t1, children: t2 }), $[4] = onClick, $[5] = onDoubleClick, $[6] = t2, $[7] = t3) : t3 = $[7], t3;
347
+ return $[4] !== onClick || $[5] !== onDoubleClick || $[6] !== t2 ? (t3 = /* @__PURE__ */ jsx("div", { className: staticMapContainer, onClick, onDoubleClick, onErrorCapture: t1, children: t2 }), $[4] = onClick, $[5] = onDoubleClick, $[6] = t2, $[7] = t3) : t3 = $[7], t3;
347
348
  }
349
+ var dialogInnerContainer = "b5c1gf0";
348
350
  const EMPTY_PATH$1 = [];
349
351
  function GeopointInput(props) {
350
- const $ = c(54), {
352
+ const $ = c(58), {
351
353
  changed,
352
354
  elementProps,
353
355
  focused,
@@ -384,40 +386,49 @@ function GeopointInput(props) {
384
386
  }, $[5] = onChange, $[6] = schemaTypeName, $[7] = t3) : t3 = $[7];
385
387
  const handleChange = t3;
386
388
  let t4;
387
- $[8] !== onChange ? (t4 = () => {
389
+ $[8] !== onChange || $[9] !== schemaTypeName ? (t4 = (zoom) => {
390
+ onChange([setIfMissing({
391
+ _type: schemaTypeName
392
+ }), set(zoom, ["zoom"])]);
393
+ }, $[8] = onChange, $[9] = schemaTypeName, $[10] = t4) : t4 = $[10];
394
+ const handleZoomChange = t4;
395
+ let t5;
396
+ $[11] !== onChange ? (t5 = () => {
388
397
  onChange(unset());
389
- }, $[8] = onChange, $[9] = t4) : t4 = $[9];
390
- const handleClear = t4;
391
- let t5, t6;
392
- if ($[10] !== modalOpen || $[11] !== onPathFocus ? (t5 = () => {
398
+ }, $[11] = onChange, $[12] = t5) : t5 = $[12];
399
+ const handleClear = t5;
400
+ let t6, t7;
401
+ if ($[13] !== modalOpen || $[14] !== onPathFocus ? (t6 = () => {
393
402
  modalOpen && onPathFocus(EMPTY_PATH$1);
394
- }, t6 = [modalOpen, onPathFocus], $[10] = modalOpen, $[11] = onPathFocus, $[12] = t5, $[13] = t6) : (t5 = $[12], t6 = $[13]), useEffect(t5, t6), !config || !config.apiKey) {
395
- let t72;
396
- return $[14] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (t72 = /* @__PURE__ */ jsx(MissingApiKeyCard, { typeTitle: "Geopoint" }), $[14] = t72) : t72 = $[14], t72;
403
+ }, t7 = [modalOpen, onPathFocus], $[13] = modalOpen, $[14] = onPathFocus, $[15] = t6, $[16] = t7) : (t6 = $[15], t7 = $[16]), useEffect(t6, t7), !config || !config.apiKey) {
404
+ let t82;
405
+ return $[17] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (t82 = /* @__PURE__ */ jsx(MissingApiKeyCard, { typeTitle: "Geopoint" }), $[17] = t82) : t82 = $[17], t82;
397
406
  }
398
- let position, t7;
399
- $[15] !== config || $[16] !== value ? (position = getValidLatLng(value), t7 = position ? getGeopointStaticMapUrl(position, config.apiKey) : null, $[15] = config, $[16] = value, $[17] = position, $[18] = t7) : (position = $[17], t7 = $[18]);
400
- const staticImageUrl = t7;
401
- let t8;
402
- $[19] !== changed || $[20] !== focused || $[21] !== handleFocusButton || $[22] !== path || $[23] !== staticImageUrl ? (t8 = staticImageUrl && /* @__PURE__ */ jsx(ChangeIndicator, { path, isChanged: changed, hasFocus: !!focused, children: /* @__PURE__ */ jsx(StaticMapPreview, { url: staticImageUrl, onClick: handleFocusButton, onDoubleClick: handleToggleModal }) }), $[19] = changed, $[20] = focused, $[21] = handleFocusButton, $[22] = path, $[23] = staticImageUrl, $[24] = t8) : t8 = $[24];
403
- const t9 = position ? 2 : 1, t10 = position ? EditIcon : void 0, t11 = position ? "Edit" : "Set location";
404
- let t12;
405
- $[25] !== ariaDescribedBy || $[26] !== handleFocus || $[27] !== id || $[28] !== inputRef || $[29] !== readOnly || $[30] !== t10 || $[31] !== t11 ? (t12 = /* @__PURE__ */ jsx(Button, { "aria-describedby": ariaDescribedBy, disabled: readOnly, icon: t10, id, mode: "ghost", onClick: handleToggleModal, onFocus: handleFocus, padding: 3, ref: inputRef, text: t11 }), $[25] = ariaDescribedBy, $[26] = handleFocus, $[27] = id, $[28] = inputRef, $[29] = readOnly, $[30] = t10, $[31] = t11, $[32] = t12) : t12 = $[32];
407
+ let position, t8;
408
+ $[18] !== config || $[19] !== value ? (position = getValidLatLng(value), t8 = position ? getGeopointStaticMapUrl(position, config.apiKey, {
409
+ zoom: value?.zoom
410
+ }) : null, $[18] = config, $[19] = value, $[20] = position, $[21] = t8) : (position = $[20], t8 = $[21]);
411
+ const staticImageUrl = t8;
412
+ let t9;
413
+ $[22] !== changed || $[23] !== focused || $[24] !== handleFocusButton || $[25] !== path || $[26] !== staticImageUrl ? (t9 = staticImageUrl && /* @__PURE__ */ jsx(ChangeIndicator, { path, isChanged: changed, hasFocus: !!focused, children: /* @__PURE__ */ jsx(StaticMapPreview, { url: staticImageUrl, onClick: handleFocusButton, onDoubleClick: handleToggleModal }) }), $[22] = changed, $[23] = focused, $[24] = handleFocusButton, $[25] = path, $[26] = staticImageUrl, $[27] = t9) : t9 = $[27];
414
+ const t10 = position ? 2 : 1, t11 = position ? EditIcon : void 0, t12 = position ? "Edit" : "Set location";
406
415
  let t13;
407
- $[33] !== handleClear || $[34] !== position || $[35] !== readOnly ? (t13 = position && /* @__PURE__ */ jsx(Button, { disabled: readOnly, icon: TrashIcon, mode: "ghost", onClick: handleClear, padding: 3, text: "Remove", tone: "critical" }), $[33] = handleClear, $[34] = position, $[35] = readOnly, $[36] = t13) : t13 = $[36];
416
+ $[28] !== ariaDescribedBy || $[29] !== handleFocus || $[30] !== id || $[31] !== inputRef || $[32] !== readOnly || $[33] !== t11 || $[34] !== t12 ? (t13 = /* @__PURE__ */ jsx(Button, { "aria-describedby": ariaDescribedBy, disabled: readOnly, icon: t11, id, mode: "ghost", onClick: handleToggleModal, onFocus: handleFocus, padding: 3, ref: inputRef, text: t12 }), $[28] = ariaDescribedBy, $[29] = handleFocus, $[30] = id, $[31] = inputRef, $[32] = readOnly, $[33] = t11, $[34] = t12, $[35] = t13) : t13 = $[35];
408
417
  let t14;
409
- $[37] !== t12 || $[38] !== t13 || $[39] !== t9 ? (t14 = /* @__PURE__ */ jsx(Box, { children: /* @__PURE__ */ jsxs(Grid, { gridTemplateColumns: t9, gap: 3, children: [
410
- t12,
411
- t13
412
- ] }) }), $[37] = t12, $[38] = t13, $[39] = t9, $[40] = t14) : t14 = $[40];
418
+ $[36] !== handleClear || $[37] !== position || $[38] !== readOnly ? (t14 = position && /* @__PURE__ */ jsx(Button, { disabled: readOnly, icon: TrashIcon, mode: "ghost", onClick: handleClear, padding: 3, text: "Remove", tone: "critical" }), $[36] = handleClear, $[37] = position, $[38] = readOnly, $[39] = t14) : t14 = $[39];
413
419
  let t15;
414
- $[41] !== config || $[42] !== dialogId || $[43] !== handleBlur || $[44] !== handleChange || $[45] !== handleCloseModal || $[46] !== modalOpen || $[47] !== readOnly || $[48] !== value ? (t15 = modalOpen && /* @__PURE__ */ jsx(Dialog, { header: "Place the marker on the map", id: `${dialogId}_dialog`, onBlur: handleBlur, onClose: handleCloseModal, ref: dialogRef, width: 1, children: /* @__PURE__ */ jsx(DialogInnerContainer, { children: /* @__PURE__ */ jsx(APIProvider, { apiKey: config.apiKey, children: /* @__PURE__ */ jsx(MapApiGate, { children: /* @__PURE__ */ jsx(GeopointSelect, { value: value || void 0, onChange: readOnly ? void 0 : handleChange, defaultLocation: config.defaultLocation, defaultZoom: config.defaultZoom }) }) }) }) }), $[41] = config, $[42] = dialogId, $[43] = handleBlur, $[44] = handleChange, $[45] = handleCloseModal, $[46] = modalOpen, $[47] = readOnly, $[48] = value, $[49] = t15) : t15 = $[49];
420
+ $[40] !== t10 || $[41] !== t13 || $[42] !== t14 ? (t15 = /* @__PURE__ */ jsx(Box, { children: /* @__PURE__ */ jsxs(Grid, { gridTemplateColumns: t10, gap: 3, children: [
421
+ t13,
422
+ t14
423
+ ] }) }), $[40] = t10, $[41] = t13, $[42] = t14, $[43] = t15) : t15 = $[43];
415
424
  let t16;
416
- return $[50] !== t14 || $[51] !== t15 || $[52] !== t8 ? (t16 = /* @__PURE__ */ jsxs(Stack, { gap: 3, children: [
417
- t8,
418
- t14,
419
- t15
420
- ] }), $[50] = t14, $[51] = t15, $[52] = t8, $[53] = t16) : t16 = $[53], t16;
425
+ $[44] !== config || $[45] !== dialogId || $[46] !== handleBlur || $[47] !== handleChange || $[48] !== handleCloseModal || $[49] !== handleZoomChange || $[50] !== modalOpen || $[51] !== readOnly || $[52] !== value ? (t16 = modalOpen && /* @__PURE__ */ jsx(Dialog, { header: "Place the marker on the map", id: `${dialogId}_dialog`, onBlur: handleBlur, onClose: handleCloseModal, ref: dialogRef, width: 1, children: /* @__PURE__ */ jsx("div", { className: dialogInnerContainer, children: /* @__PURE__ */ jsx(APIProvider, { apiKey: config.apiKey, children: /* @__PURE__ */ jsx(MapApiGate, { children: /* @__PURE__ */ jsx(GeopointSelect, { value: value || void 0, onChange: readOnly ? void 0 : handleChange, onZoomChange: readOnly || !config.saveZoom ? void 0 : handleZoomChange, defaultLocation: config.defaultLocation, defaultZoom: value?.zoom || config.defaultZoom }) }) }) }) }), $[44] = config, $[45] = dialogId, $[46] = handleBlur, $[47] = handleChange, $[48] = handleCloseModal, $[49] = handleZoomChange, $[50] = modalOpen, $[51] = readOnly, $[52] = value, $[53] = t16) : t16 = $[53];
426
+ let t17;
427
+ return $[54] !== t15 || $[55] !== t16 || $[56] !== t9 ? (t17 = /* @__PURE__ */ jsxs(Stack, { gap: 3, children: [
428
+ t9,
429
+ t15,
430
+ t16
431
+ ] }), $[54] = t15, $[55] = t16, $[56] = t9, $[57] = t17) : t17 = $[57], t17;
421
432
  }
422
433
  function _temp$1(currentState) {
423
434
  return !currentState;
@@ -588,7 +599,7 @@ function GeopointRadiusInput(props) {
588
599
  t15
589
600
  ] }) }), $[52] = t11, $[53] = t14, $[54] = t15, $[55] = t16) : t16 = $[55];
590
601
  let t17;
591
- $[56] !== config.apiKey || $[57] !== config.defaultLocation || $[58] !== config.defaultRadius || $[59] !== config.defaultRadiusZoom || $[60] !== dialogId || $[61] !== handleBlur || $[62] !== handleChange || $[63] !== handleCloseModal || $[64] !== modalOpen || $[65] !== readOnly || $[66] !== value ? (t17 = modalOpen && /* @__PURE__ */ jsx(Dialog, { header: "Place the marker and set radius on the map", id: `${dialogId}_dialog`, onBlur: handleBlur, onClose: handleCloseModal, ref: dialogRef, width: 1, children: /* @__PURE__ */ jsx(DialogInnerContainer, { children: /* @__PURE__ */ jsx(APIProvider, { apiKey: config.apiKey, children: /* @__PURE__ */ jsx(MapApiGate, { children: /* @__PURE__ */ jsx(GeopointRadiusSelect, { value: value || void 0, onChange: readOnly ? void 0 : handleChange, defaultLocation: config.defaultLocation, defaultRadiusZoom: config.defaultRadiusZoom, defaultRadius: config.defaultRadius }) }) }) }) }), $[56] = config.apiKey, $[57] = config.defaultLocation, $[58] = config.defaultRadius, $[59] = config.defaultRadiusZoom, $[60] = dialogId, $[61] = handleBlur, $[62] = handleChange, $[63] = handleCloseModal, $[64] = modalOpen, $[65] = readOnly, $[66] = value, $[67] = t17) : t17 = $[67];
602
+ $[56] !== config.apiKey || $[57] !== config.defaultLocation || $[58] !== config.defaultRadius || $[59] !== config.defaultRadiusZoom || $[60] !== dialogId || $[61] !== handleBlur || $[62] !== handleChange || $[63] !== handleCloseModal || $[64] !== modalOpen || $[65] !== readOnly || $[66] !== value ? (t17 = modalOpen && /* @__PURE__ */ jsx(Dialog, { header: "Place the marker and set radius on the map", id: `${dialogId}_dialog`, onBlur: handleBlur, onClose: handleCloseModal, ref: dialogRef, width: 1, children: /* @__PURE__ */ jsx("div", { className: dialogInnerContainer, children: /* @__PURE__ */ jsx(APIProvider, { apiKey: config.apiKey, children: /* @__PURE__ */ jsx(MapApiGate, { children: /* @__PURE__ */ jsx(GeopointRadiusSelect, { value: value || void 0, onChange: readOnly ? void 0 : handleChange, defaultLocation: config.defaultLocation, defaultRadiusZoom: config.defaultRadiusZoom, defaultRadius: config.defaultRadius }) }) }) }) }), $[56] = config.apiKey, $[57] = config.defaultLocation, $[58] = config.defaultRadius, $[59] = config.defaultRadiusZoom, $[60] = dialogId, $[61] = handleBlur, $[62] = handleChange, $[63] = handleCloseModal, $[64] = modalOpen, $[65] = readOnly, $[66] = value, $[67] = t17) : t17 = $[67];
592
603
  let t18;
593
604
  return $[68] !== t10 || $[69] !== t16 || $[70] !== t17 || $[71] !== t9 ? (t18 = /* @__PURE__ */ jsxs(Stack, { gap: 3, children: [
594
605
  t9,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/map/staticMapUrl.ts","../src/diff/GeoConfigContext.tsx","../src/diff/StaticMapDiffPreview.styles.tsx","../src/diff/StaticMapDiffPreview.tsx","../src/diff/GeopointDiff.tsx","../src/input/ApiKeyMessages.tsx","../src/map/MapApiGate.tsx","../src/utils.ts","../src/input/GeopointInput.styles.tsx","../src/map/constants.ts","../src/map/SearchInput.styles.tsx","../src/map/SearchInput.tsx","../src/input/GeopointSelect.tsx","../src/input/StaticMapPreview.tsx","../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\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 {width = DEFAULT_WIDTH, height = DEFAULT_HEIGHT}: StaticMapSize = {},\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: 13,\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 {styled} from 'styled-components'\n\nexport const MapDiffImage = styled.div`\n & img {\n display: block;\n width: 100%;\n height: auto;\n object-fit: contain;\n vertical-align: top;\n }\n`\n\nexport const MapDiffPlaceholder = styled.div`\n width: 100%;\n min-height: 80px;\n display: flex;\n align-items: center;\n justify-content: center;\n`\n","import {ImageIcon} from '@sanity/icons'\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'\nimport {MapDiffImage, MapDiffPlaceholder} from './StaticMapDiffPreview.styles'\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 <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 </MapDiffPlaceholder>\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 <MapDiffImage>\n <img alt=\"\" src={url} onError={() => setFailed(true)} height={280} width={500} />\n </MapDiffImage>\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, WarningOutlineIcon} from '@sanity/icons'\nimport {Box, Card, Code, Flex, Stack, Text} from '@sanity/ui'\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","import {styled} from 'styled-components'\n\nexport const StaticMapContainer = styled.div`\n cursor: pointer;\n\n & img {\n width: 100%;\n height: auto;\n display: block;\n vertical-align: top;\n }\n`\n\nexport const DialogInnerContainer = styled.div`\n height: 40rem;\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 {styled} from 'styled-components'\n\nexport const SearchInputContainer = styled.div`\n margin: 10px;\n width: 240px;\n\n & gmp-place-autocomplete {\n width: 100%;\n }\n`\n","import {useMap, useMapsLibrary} from '@vis.gl/react-google-maps'\n\nimport type {LatLng} from '../types'\nimport {SearchInputContainer} from './SearchInput.styles'\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 <SearchInputContainer>\n <gmp-place-autocomplete\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 </SearchInputContainer>\n )\n}\n","import {\n AdvancedMarker,\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 {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 defaultLocation?: LatLng\n defaultZoom?: number\n}\n\nexport function GeopointSelect({\n value,\n onChange,\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 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 return (\n <Map\n mapId={MAP_ID}\n defaultCenter={center}\n defaultZoom={defaultZoom}\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 <AdvancedMarker\n position={position}\n draggable={Boolean(onChange)}\n onDragEnd={handleMarkerDragEnd}\n />\n )}\n </Map>\n )\n}\n","import {StaticMap} from '@vis.gl/react-google-maps'\nimport {useState} from 'react'\n\nimport {InvalidApiKeyCard} from './ApiKeyMessages'\nimport {StaticMapContainer} from './GeopointInput.styles'\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 <StaticMapContainer\n onClick={onClick}\n onDoubleClick={onDoubleClick}\n onErrorCapture={() => setFailed(true)}\n >\n <StaticMap url={url} />\n </StaticMapContainer>\n )\n}\n","import {EditIcon, TrashIcon} from '@sanity/icons'\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 {DialogInnerContainer} from './GeopointInput.styles'\nimport {GeopointSelect} from './GeopointSelect'\nimport {StaticMapPreview} from './StaticMapPreview'\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 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 ? getGeopointStaticMapUrl(position, config.apiKey) : 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 <DialogInnerContainer>\n <APIProvider apiKey={config.apiKey}>\n <MapApiGate>\n <GeopointSelect\n value={value || undefined}\n onChange={readOnly ? undefined : handleChange}\n defaultLocation={config.defaultLocation}\n defaultZoom={config.defaultZoom}\n />\n </MapApiGate>\n </APIProvider>\n </DialogInnerContainer>\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, TrashIcon} from '@sanity/icons'\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 {DialogInnerContainer} from './GeopointInput.styles'\nimport {GeopointRadiusSelect} from './GeopointRadiusSelect'\nimport {StaticMapPreview} from './StaticMapPreview'\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 <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 </DialogInnerContainer>\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"],"names":["DEFAULT_WIDTH","DEFAULT_HEIGHT","METERS_PER_DEGREE","MIN_LATITUDE_COSINE","CIRCLE_OUTLINE","CIRCLE_FILL","lngMetersPerDegree","lat","Math","max","cos","PI","getGeopointStaticMapUrl","value","apiKey","width","height","center","lng","createStaticMapsUrl","scale","zoom","markers","location","generateCirclePoints","radius","points","latRatio","lngRatio","i","steps","angle","push","sin","BOUNDS_PADDING","getCircleBounds","padded","latDelta","lngDelta","getGeopointRadiusStaticMapUrl","paths","coordinates","color","weight","fillcolor","visible","GoogleMapsInputContext","createContext","displayName","MapDiffImage","styled","div","withConfig","componentId","MapDiffPlaceholder","hasRadius","StaticMapDiffPreview","t0","$","_c","failed","setFailed","useState","use","t1","for","url","t2","t3","GeopointDiff","diff","schemaType","GET_API_KEY_URL","DEMO_KEY_URL","REQUIRED_APIS","RequiredApis","Symbol","map","_temp","api","MessageCard","tone","icon","title","children","t4","t5","MissingApiKeyCard","typeTitle","t6","t7","t8","InvalidApiKeyCard","MapApiGate","status","useApiLoadingStatus","APILoadingStatus","AUTH_FAILURE","FAILED","LOADED","getValidLatLng","Number","isFinite","StaticMapContainer","DialogInnerContainer","MAP_ID","SearchInputContainer","SearchInput","onSelect","places","useMapsLibrary","useMap","placePrediction","place","toPlace","fetchFields","fields","latLng","panTo","fallbackLatLng","defaultMapLocation","GeopointSelect","onChange","defaultLocation","defaultZoom","undefined","position","event","detail","handleMapClick","event_0","handleMarkerDragEnd","handleSelect","t9","ControlPosition","TOP_RIGHT","t10","Boolean","t11","StaticMapPreview","onClick","onDoubleClick","EMPTY_PATH","GeopointInput","props","changed","elementProps","focused","geoConfig","config","onPathFocus","path","readOnly","id","ref","inputRef","onBlur","handleBlur","onFocus","handleFocus","ariaDescribedBy","schemaTypeName","name","dialogId","useId","dialogRef","useRef","current","focus","handleFocusButton","modalOpen","setModalOpen","blur","handleCloseModal","handleToggleModal","setIfMissing","_type","set","handleChange","unset","handleClear","useEffect","staticImageUrl","EditIcon","t12","t13","TrashIcon","t14","t15","t16","currentState","GeopointRadiusSelect","defaultRadiusZoom","defaultRadius","currentRadius","round","setValue","radius_0","handleCircleRadiusChanged","event_1","handleCircleDragEnd","GeopointRadiusInput","currentTarget","handleRadiusChange","t17","t18","googleMapsInput","definePlugin","studio","components","activeToolLayout","renderDefault","schema","types","type","validation","Rule","required","min","preview","select","prepare","toFixed","subtitle","form","input","isGeopoint","isGeopointRadius","isType"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/map/staticMapUrl.ts","../src/diff/GeoConfigContext.tsx","../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.tsx","../src/input/GeopointSelect.tsx","../src/input/StaticMapPreview.tsx","../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 {ImageIcon} from '@sanity/icons'\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, WarningOutlineIcon} from '@sanity/icons'\nimport {Box, Card, Code, Flex, Stack, Text} from '@sanity/ui'\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 {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 {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 {EditIcon, TrashIcon} from '@sanity/icons'\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, TrashIcon} from '@sanity/icons'\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"],"names":["DEFAULT_WIDTH","DEFAULT_HEIGHT","METERS_PER_DEGREE","MIN_LATITUDE_COSINE","CIRCLE_OUTLINE","CIRCLE_FILL","lngMetersPerDegree","lat","Math","max","cos","PI","DEFAULT_ZOOM","getGeopointStaticMapUrl","value","apiKey","width","height","zoom","center","lng","createStaticMapsUrl","scale","markers","location","generateCirclePoints","radius","points","latRatio","lngRatio","i","steps","angle","push","sin","BOUNDS_PADDING","getCircleBounds","padded","latDelta","lngDelta","getGeopointRadiusStaticMapUrl","paths","coordinates","color","weight","fillcolor","visible","GoogleMapsInputContext","createContext","displayName","hasRadius","StaticMapDiffPreview","t0","$","_c","failed","setFailed","useState","use","t1","Symbol","for","mapDiffPlaceholder","url","t2","t3","mapDiffImage","GeopointDiff","diff","schemaType","GET_API_KEY_URL","DEMO_KEY_URL","REQUIRED_APIS","RequiredApis","map","_temp","api","MessageCard","tone","icon","title","children","t4","t5","MissingApiKeyCard","typeTitle","t6","t7","t8","InvalidApiKeyCard","MapApiGate","status","useApiLoadingStatus","APILoadingStatus","AUTH_FAILURE","FAILED","LOADED","getValidLatLng","Number","isFinite","MAP_ID","SearchInput","onSelect","places","useMapsLibrary","useMap","searchInput","placePrediction","place","toPlace","fetchFields","fields","latLng","panTo","fallbackLatLng","defaultMapLocation","GeopointSelect","onChange","onZoomChange","defaultLocation","defaultZoom","undefined","position","round","lastZoomRef","useRef","event","detail","handleMapClick","event_0","handleMarkerDragEnd","handleSelect","t9","event_1","current","t10","t11","t12","ControlPosition","TOP_RIGHT","t13","Boolean","t14","StaticMapPreview","onClick","onDoubleClick","staticMapImage","staticMapContainer","EMPTY_PATH","GeopointInput","props","changed","elementProps","focused","geoConfig","config","onPathFocus","path","readOnly","id","ref","inputRef","onBlur","handleBlur","onFocus","handleFocus","ariaDescribedBy","schemaTypeName","name","dialogId","useId","dialogRef","focus","handleFocusButton","modalOpen","setModalOpen","blur","handleCloseModal","handleToggleModal","setIfMissing","_type","set","handleChange","handleZoomChange","unset","handleClear","useEffect","staticImageUrl","EditIcon","TrashIcon","t15","t16","dialogInnerContainer","saveZoom","t17","currentState","GeopointRadiusSelect","defaultRadiusZoom","defaultRadius","currentRadius","setValue","radius_0","handleCircleRadiusChanged","handleCircleDragEnd","GeopointRadiusInput","currentTarget","handleRadiusChange","t18","googleMapsInput","definePlugin","studio","components","activeToolLayout","renderDefault","schema","types","type","validation","Rule","required","min","preview","select","prepare","toFixed","subtitle","form","input","isGeopoint","isGeopointRadius","isType"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sanity/google-maps-input",
3
- "version": "6.0.1",
3
+ "version": "6.1.0",
4
4
  "description": "Sanity plugin providing input handlers for geo-related input types using Google Maps",
5
5
  "keywords": [
6
6
  "cms",
@@ -29,6 +29,12 @@
29
29
  "types": "./dist/index.d.ts",
30
30
  "exports": {
31
31
  ".": "./dist/index.js",
32
+ "./bundle.css": {
33
+ "browser": "./dist/bundle.css",
34
+ "style": "./dist/bundle.css",
35
+ "node": "./dist/bundle.css.js",
36
+ "default": "./dist/bundle.css.js"
37
+ },
32
38
  "./package.json": "./package.json"
33
39
  },
34
40
  "dependencies": {
@@ -37,12 +43,13 @@
37
43
  "@vis.gl/react-google-maps": "^1.8.3"
38
44
  },
39
45
  "devDependencies": {
40
- "@sanity/pkg-utils": "^10.7.1",
46
+ "@sanity/pkg-utils": "^10.7.2",
41
47
  "@types/google.maps": "^3.65.2",
42
48
  "@types/react": "^19.2.17",
43
49
  "@types/react-dom": "^19.2.3",
50
+ "@vanilla-extract/css": "^1.21.0",
51
+ "@vanilla-extract/vite-plugin": "^5.2.3",
44
52
  "babel-plugin-react-compiler": "^1.0.0",
45
- "babel-plugin-styled-components": "^2.3.0",
46
53
  "react": "^19.2.7",
47
54
  "react-dom": "^19.2.7",
48
55
  "sanity": "^6.2.0",