sanity-plugin-hotspot-array

5.0.125.0.13
~

Modified (5 files)

Index: package/dist/index.js
===================================================================
--- package/dist/index.js
+++ package/dist/index.js
@@ -1,13 +1,15 @@
+import "@sanity/ui/styles.css";
 import { c } from "react/compiler-runtime";
 import { getImageDimensions } from "@sanity/asset-utils";
 import { createImageUrlBuilder } from "@sanity/image-url";
-import { Box, Card, Flex, Stack, Text, Tooltip } from "@sanity/ui";
+import { Box, Card, Flex, Stack, Text } from "@sanity/ui";
 import { randomKey } from "@sanity/util/content";
 import get from "lodash-es/get.js";
 import { useEffect, useMemo, useRef, useState } from "react";
 import { PatchEvent, definePlugin, insert, set, setIfMissing, useClient, useFormValue, useResolveInitialValueForType } from "sanity";
 import { Fragment, jsx, jsxs } from "react/jsx-runtime";
+import { Tooltip } from "@sanity/ui/tooltip";
 import { motion, useMotionValue } from "motion/react";
 function Feedback(t0) {
 	let $ = c(2), { children } = t0, t1;
 	return $[0] === children ? t1 = $[1] : (t1 = /* @__PURE__ */ jsx(Card, {
Index: package/package.json
===================================================================
--- package/package.json
+++ package/package.json
@@ -1,7 +1,7 @@
 {
   "name": "sanity-plugin-hotspot-array",
-  "version": "5.0.12",
+  "version": "5.0.13",
   "description": "A configurable Custom Input for Arrays that will add and update items by clicking on an Image",
   "keywords": [
     "sanity",
     "sanity-plugin"
@@ -28,10 +28,10 @@
   },
   "dependencies": {
     "@sanity/asset-utils": "^2.3.0",
     "@sanity/image-url": "^2.1.1",
-    "@sanity/ui": "^3.5.1",
-    "@sanity/util": "^6.7.0",
+    "@sanity/ui": "^4.0.0",
+    "@sanity/util": "^6.9.0",
     "lodash-es": "^4.18.1",
     "motion": "^12.43.0"
   },
   "devDependencies": {
@@ -43,9 +43,9 @@
     "@types/react-dom": "^19.2.4",
     "babel-plugin-react-compiler": "^1.0.0",
     "react": "^19.2.8",
     "react-dom": "^19.2.8",
-    "sanity": "^6.7.0",
+    "sanity": "^6.9.0",
     "styled-components": "^6.4.4",
     "tsdown": "^0.22.14"
   },
   "peerDependencies": {
Index: package/dist/index.d.ts.map
===================================================================
--- package/dist/index.d.ts.map
+++ package/dist/index.d.ts.map
@@ -1,1 +1,1 @@
-{"version":3,"file":"index.d.ts","names":[],"sources":["../src/Spot.tsx","../src/plugin.tsx","../src/ImageHotspotArray.tsx"],"mappings":";;UA0EiB,oBAAoB;GAAkB;;EACrD,OAAO,YAAY;EACnB,YAAY;EACZ,eAAe;;UCvEA,oBAAoB;GAAkB;;EACrD;EACA;EACA;EACA,UAAU,cAAc,oBAAoB;;;YAI3B;IACf,eAAe;;;cAIN,0CAAuB;KCYxB,YAAY;GAAkB;;EACxC;EACA;EACA;EACA;IACE;iBAEY,kBACd,OAAO,yBAAyB;EAAgB,qBAAqB;IACpE"}
\ No newline at end of file
+{"version":3,"file":"index.d.ts","names":[],"sources":["../src/Spot.tsx","../src/plugin.tsx","../src/ImageHotspotArray.tsx"],"mappings":";;;UA2EiB,oBAAoB;GAAkB;;EACrD,OAAO,YAAY;EACnB,YAAY;EACZ,eAAe;;UCxEA,oBAAoB;GAAkB;;EACrD;EACA;EACA;EACA,UAAU,cAAc,oBAAoB;;;YAI3B;IACf,eAAe;;;cAIN,0CAAuB;KCYxB,YAAY;GAAkB;;EACxC;EACA;EACA;EACA;IACE;iBAEY,kBACd,OAAO,yBAAyB;EAAgB,qBAAqB;IACpE"}
\ No newline at end of file
Index: package/dist/index.js.map
===================================================================
--- package/dist/index.js.map
+++ package/dist/index.js.map
@@ -1,1 +1,1 @@
-{"version":3,"file":"index.js","names":["Card","Text","Feedback","t0","$","_c","children","t1","Box","Text","Tooltip","get","motion","useMotionValue","ComponentType","CSSProperties","ReactNode","useCallback","useEffect","useState","ObjectSchemaType","RenderPreviewCallback","FnHotspotMove","HotspotItem","dragStyle","width","height","position","boxSizing","top","left","margin","cursor","display","justifyContent","alignItems","borderRadius","background","color","dragStyleWhileDrag","border","dragStyleWhileHover","dotStyle","visibility","pointerEvents","dotStyleWhileActive","labelStyle","fontSize","fontWeight","lineHeight","labelStyleWhileActive","round","num","Math","HotspotTooltipProps","key","value","HotspotFields","schemaType","renderPreview","HotspotProps","bounds","DOMRectReadOnly","update","hotspotDescriptionPath","tooltip","index","Spot","t0","$","_c","TooltipComponent","isDragging","setIsDragging","isHovering","setIsHovering","t1","x","t2","t3","y","t4","t5","set","t6","t7","_key","currentX","currentY","newX","newY","safeX","max","min","safeY","handleDragEnd","t8","Symbol","for","handleDragStart","t9","handleHoverStart","t10","handleHoverEnd","t11","t12","t13","t14","maxWidth","t15","t16","t17","t18","t19","t20","t21","t22","t23","ComponentType","ArrayOfObjectsInputProps","definePlugin","HotspotItem","ImageHotspotArray","HotspotTooltipProps","ImageHotspotOptions","key","pathRoot","imagePath","descriptionPath","tooltip","HotspotFields","ArrayOptions","imageHotspot","imageHotspotArrayPlugin","name","form","components","input","props","schemaType","jsonType","options","imageHotspotOptions","renderDefault","DependencyList","useEffect","useMemo","useRef","useUnmountEffect","effect","$","_c","effectRef","t0","t1","current","t2","t3","Symbol","for","DebouncedFunction","args","this","ThisParameterType","Fn","Parameters","useDebouncedCallback","callback","deps","delay","maxWait","timeout","ReturnType","setTimeout","undefined","waitTimeout","cb","lastCall","clear","clearTimeout","execute","context","apply","wrapped","Object","defineProperties","length","value","name","RefObject","useEffect","useRef","isBrowser","window","navigator","document","UseResizeObserverCallback","entry","ResizeObserverEntry","ResizeObserverSingleton","observer","ResizeObserver","subscribe","target","Element","callback","unsubscribe","observerSingleton","getResizeObserver","undefined","callbacks","Map","Set","entries","get","forEach","cb","setTimeout","cbs","set","observe","add","delete","size","unobserve","useResizeObserver","t0","$","_c","enabled","t1","ro","t2","t3","current","tgt","t4","_tgt","subscribed","handler","t5","args","getImageDimensions","createImageUrlBuilder","Card","Flex","Stack","randomKey","get","MouseEvent","ReactNode","useCallback","useMemo","useRef","useState","ArrayOfObjectsInputProps","ImageValue","insert","ObjectSchemaType","PatchEvent","set","setIfMissing","useClient","useFormValue","useResolveInitialValueForType","Feedback","ImageHotspotOptions","Spot","useDebouncedCallback","useResizeObserver","imageStyle","width","height","VALID_ROOT_PATHS","FnHotspotMove","key","x","y","HotspotItem","_key","_type","HotspotFields","ImageHotspotArray","props","$","_c","value","onChange","imageHotspotOptions","schemaType","renderPreview","t0","Symbol","for","apiVersion","sanityClient","pathRoot","includes","t1","path","slice","imageHotspotPathRoot","rootObject","resolveInitialValueForType","t2","type","then","_temp","catch","_temp2","resolveInitialValue","t3","imagePath","hotspotImage","t4","bb0","builder","dataset","config","urlFor","source","image","asset","_ref","t5","aspectRatio","t6","Math","round","url","t7","displayImage","descriptionPath","of","event","spotType","nativeEvent","currentTarget","Number","offsetX","toFixed","offsetY","description","initialValues","newRow","name","from","handleHotspotImageClick","x_0","y_0","handleHotspotMove","hotspotImageRef","imageRect","setImageRect","t8","e","contentRect","t9","t10","tooltip","position","length","map","spot","index","t11","join","t12","t13","renderDefault","t14","initialValue"],"sources":["../src/Feedback.tsx","../src/Spot.tsx","../src/plugin.tsx","../src/useDebouncedCallback.ts","../src/useResizeObserver.ts","../src/ImageHotspotArray.tsx"],"sourcesContent":["import {Card, Text} from '@sanity/ui'\n\nexport default function Feedback({children}: {children: React.ReactNode}): React.JSX.Element {\n  return (\n    <Card padding={4} radius={2} shadow={1} tone=\"caution\">\n      <Text>{children}</Text>\n    </Card>\n  )\n}\n","import {Box, Text, Tooltip} from '@sanity/ui'\nimport get from 'lodash-es/get.js'\nimport {motion, useMotionValue} from 'motion/react'\nimport {\n  type ComponentType,\n  type CSSProperties,\n  type ReactNode,\n  useCallback,\n  useEffect,\n  useState,\n} from 'react'\nimport {type ObjectSchemaType, type RenderPreviewCallback} from 'sanity'\n\nimport {type FnHotspotMove, type HotspotItem} from './ImageHotspotArray'\n\nconst dragStyle: CSSProperties = {\n  width: '1.4rem',\n  height: '1.4rem',\n  position: 'absolute',\n  boxSizing: 'border-box',\n  top: 0,\n  left: 0,\n  margin: '-0.7rem 0 0 -0.7rem',\n  cursor: 'pointer',\n  display: 'flex',\n  justifyContent: 'center',\n  alignItems: 'center',\n  borderRadius: '50%',\n  background: '#000',\n  color: 'white',\n}\n\nconst dragStyleWhileDrag: CSSProperties = {\n  background: 'rgba(0, 0, 0, 0.1)',\n  border: '1px solid #fff',\n  cursor: 'none',\n}\n\nconst dragStyleWhileHover: CSSProperties = {\n  background: 'rgba(0, 0, 0, 0.1)',\n  border: '1px solid #fff',\n}\n\nconst dotStyle: CSSProperties = {\n  position: 'absolute',\n  left: '50%',\n  top: '50%',\n  height: '0.2rem',\n  width: '0.2rem',\n  margin: '-0.1rem 0 0 -0.1rem',\n  background: '#fff',\n  visibility: 'hidden',\n  borderRadius: '50%',\n  // make sure pointer events only run on the parent\n  pointerEvents: 'none',\n}\n\nconst dotStyleWhileActive: CSSProperties = {\n  visibility: 'visible',\n}\n\nconst labelStyle: CSSProperties = {\n  color: 'white',\n  fontSize: '0.7rem',\n  fontWeight: 600,\n  lineHeight: '1',\n}\n\nconst labelStyleWhileActive: CSSProperties = {\n  visibility: 'hidden',\n}\n\nconst round = (num: number) => Math.round(num * 100) / 100\n\nexport interface HotspotTooltipProps<HotspotFields = {[key: string]: unknown}> {\n  value: HotspotItem<HotspotFields>\n  schemaType: ObjectSchemaType\n  renderPreview: RenderPreviewCallback\n}\n\ninterface HotspotProps<HotspotFields = {[key: string]: unknown}> {\n  value: HotspotItem\n  bounds: DOMRectReadOnly\n  update: FnHotspotMove\n  hotspotDescriptionPath?: string\n  tooltip?: ComponentType<HotspotTooltipProps<HotspotFields>>\n  index: number\n  schemaType: ObjectSchemaType\n  renderPreview: RenderPreviewCallback\n}\n\nexport default function Spot({\n  value,\n  bounds,\n  update,\n  hotspotDescriptionPath,\n  tooltip: TooltipComponent,\n  index,\n  schemaType,\n  renderPreview,\n}: HotspotProps): ReactNode {\n  const [isDragging, setIsDragging] = useState(false)\n  const [isHovering, setIsHovering] = useState(false)\n\n  // x/y are stored as % but need to be converted to px\n  const x = useMotionValue(round(bounds.width * (value.x / 100)))\n  const y = useMotionValue(round(bounds.height * (value.y / 100)))\n\n  /**\n   * update x/y if the bounds change when resizing the window\n   */\n  useEffect(() => {\n    x.set(round(bounds.width * (value.x / 100)))\n    y.set(round(bounds.height * (value.y / 100)))\n  }, [x, y, value, bounds])\n\n  const handleDragEnd = useCallback(() => {\n    setIsDragging(false)\n\n    // get current values for x/y in px\n    const currentX = x.get()\n    const currentY = y.get()\n\n    // Which we need to convert back to `%` to patch the document\n    const newX = round((currentX * 100) / bounds.width)\n    const newY = round((currentY * 100) / bounds.height)\n\n    // Don't go below 0 or above 100\n    const safeX = Math.max(0, Math.min(100, newX))\n    const safeY = Math.max(0, Math.min(100, newY))\n\n    update(value._key, safeX, safeY)\n  }, [x, y, value, update, bounds])\n  const handleDragStart = useCallback(() => setIsDragging(true), [])\n\n  const handleHoverStart = useCallback(() => setIsHovering(true), [])\n  const handleHoverEnd = useCallback(() => setIsHovering(false), [])\n\n  if (!x || !y) {\n    return null\n  }\n\n  return (\n    <motion.div\n      drag\n      dragConstraints={bounds}\n      dragElastic={0}\n      dragMomentum={false}\n      onDragEnd={handleDragEnd}\n      onDragStart={handleDragStart}\n      onHoverStart={handleHoverStart}\n      onHoverEnd={handleHoverEnd}\n      style={{\n        ...dragStyle,\n        x,\n        y,\n        ...(isDragging && {...dragStyleWhileDrag}),\n        ...(isHovering && {...dragStyleWhileHover}),\n      }}\n    >\n      <Tooltip\n        key={value._key}\n        disabled={isDragging}\n        portal\n        content={\n          TooltipComponent && typeof TooltipComponent === 'function' ? (\n            <TooltipComponent value={value} renderPreview={renderPreview} schemaType={schemaType} />\n          ) : (\n            <Box padding={2} style={{maxWidth: 200, pointerEvents: `none`}}>\n              <Text textOverflow=\"ellipsis\">\n                {hotspotDescriptionPath\n                  ? // oxlint-disable-next-line typescript-eslint/no-unsafe-type-assertion -- the configured descriptionPath is expected to point to a string field\n                    (get(value, hotspotDescriptionPath) as string)\n                  : `${value.x}% x ${value.y}%`}\n              </Text>\n            </Box>\n          )\n        }\n      >\n        <div>\n          {/* Dot */}\n          <Box\n            style={{\n              ...dotStyle,\n              ...((isDragging || isHovering) && {...dotStyleWhileActive}),\n            }}\n          />\n          {/* Label */}\n          <div\n            style={{\n              ...labelStyle,\n              ...((isDragging || isHovering) && {...labelStyleWhileActive}),\n            }}\n          >\n            {index + 1}\n          </div>\n        </div>\n      </Tooltip>\n    </motion.div>\n  )\n}\n","import {type ComponentType} from 'react'\nimport {type ArrayOfObjectsInputProps, definePlugin} from 'sanity'\n\nimport {type HotspotItem, ImageHotspotArray} from './ImageHotspotArray'\nimport {type HotspotTooltipProps} from './Spot'\n\nexport interface ImageHotspotOptions<HotspotFields = {[key: string]: unknown}> {\n  pathRoot?: 'document' | 'parent'\n  imagePath: string\n  descriptionPath?: string\n  tooltip?: ComponentType<HotspotTooltipProps<HotspotFields>>\n}\n\ndeclare module 'sanity' {\n  export interface ArrayOptions {\n    imageHotspot?: ImageHotspotOptions\n  }\n}\n\nexport const imageHotspotArrayPlugin = definePlugin({\n  name: 'image-hotspot-array',\n  form: {\n    components: {\n      input: (props) => {\n        if (props.schemaType.jsonType === 'array' && props.schemaType.options?.imageHotspot) {\n          const imageHotspotOptions = props.schemaType.options?.imageHotspot\n          if (imageHotspotOptions) {\n            return (\n              <ImageHotspotArray\n                // oxlint-disable-next-line typescript-eslint/no-unsafe-type-assertion -- narrowed by the jsonType/options checks above\n                {...(props as unknown as ArrayOfObjectsInputProps<HotspotItem>)}\n                imageHotspotOptions={imageHotspotOptions}\n              />\n            )\n          }\n        }\n        return props.renderDefault(props)\n      },\n    },\n  },\n})\n","// copied from react-hookz/web\n// https://github.com/react-hookz/web/blob/579a445fcc9f4f4bb5b9d5e670b2e57448b4ee50/src/useDebouncedCallback/index.ts\nimport {type DependencyList, useEffect, useMemo, useRef} from 'react'\n\n/**\n * Run effect only when component is unmounted.\n *\n * @param effect Effector to run on unmount\n */\nfunction useUnmountEffect(effect: CallableFunction): void {\n  const effectRef = useRef(effect)\n  useEffect(() => {\n    effectRef.current = effect\n  }, [effect])\n  useEffect(() => () => effectRef.current(), [])\n}\n\nexport type DebouncedFunction<Fn extends (...args: any[]) => any> = (\n  this: ThisParameterType<Fn>,\n  ...args: Parameters<Fn>\n) => void\n\n/**\n * Makes passed function debounced, otherwise acts like `useCallback`.\n *\n * @param callback Function that will be debounced.\n * @param deps Dependencies list when to update callback. It also replaces invoked\n * \tcallback for scheduled debounced invocations.\n * @param delay Debounce delay.\n * @param maxWait The maximum time `callback` is allowed to be delayed before\n * it's invoked. 0 means no max wait.\n */\nexport function useDebouncedCallback<Fn extends (...args: any[]) => any>(\n  callback: Fn,\n  deps: DependencyList,\n  delay: number,\n  maxWait = 0,\n): DebouncedFunction<Fn> {\n  const timeout = useRef<ReturnType<typeof setTimeout>>(undefined)\n  const waitTimeout = useRef<ReturnType<typeof setTimeout>>(undefined)\n  const cb = useRef(callback)\n  const lastCall = useRef<{args: Parameters<Fn>; this: ThisParameterType<Fn>}>(undefined)\n\n  const clear = () => {\n    if (timeout.current) {\n      clearTimeout(timeout.current)\n      timeout.current = undefined\n    }\n\n    if (waitTimeout.current) {\n      clearTimeout(waitTimeout.current)\n      waitTimeout.current = undefined\n    }\n  }\n\n  // Cancel scheduled execution on unmount\n  useUnmountEffect(clear)\n\n  useEffect(() => {\n    cb.current = callback\n    // oxlint-disable-next-line react/exhaustive-deps -- deps are provided by the caller via the `deps` argument\n  }, deps)\n\n  // oxlint-disable react/react-compiler\n  return useMemo(() => {\n    const execute = () => {\n      clear()\n\n      // Barely possible to test this line\n      /* istanbul ignore next */\n      if (!lastCall.current) return\n\n      const context = lastCall.current\n      lastCall.current = undefined\n\n      cb.current.apply(context.this, context.args)\n    }\n\n    const wrapped = function (this, ...args) {\n      if (timeout.current) {\n        clearTimeout(timeout.current)\n      }\n\n      lastCall.current = {args, this: this}\n\n      // Plan regular execution\n      timeout.current = setTimeout(execute, delay)\n\n      // Plan maxWait execution if required\n      if (maxWait > 0 && !waitTimeout.current) {\n        waitTimeout.current = setTimeout(execute, maxWait)\n      }\n    } as DebouncedFunction<Fn>\n\n    Object.defineProperties(wrapped, {\n      length: {value: callback.length},\n      name: {value: `${callback.name || 'anonymous'}__debounced__${delay}`},\n    })\n\n    return wrapped\n    // oxlint-disable-next-line react/exhaustive-deps -- deps are provided by the caller via the `deps` argument\n  }, [delay, maxWait, ...deps])\n  // oxlint-enable react/react-compiler\n}\n","// copied from react-hookz/web\n// https://github.com/react-hookz/web/blob/579a445fcc9f4f4bb5b9d5e670b2e57448b4ee50/src/useResizeObserver/index.ts\nimport {type RefObject, useEffect, useRef} from 'react'\n\nconst isBrowser =\n  typeof window !== 'undefined' &&\n  typeof navigator !== 'undefined' &&\n  typeof document !== 'undefined'\n\nexport type UseResizeObserverCallback = (entry: ResizeObserverEntry) => void\n\ntype ResizeObserverSingleton = {\n  observer: ResizeObserver\n  subscribe: (target: Element, callback: UseResizeObserverCallback) => void\n  unsubscribe: (target: Element, callback: UseResizeObserverCallback) => void\n}\n\nlet observerSingleton: ResizeObserverSingleton\n\nfunction getResizeObserver(): ResizeObserverSingleton | undefined {\n  if (!isBrowser) return undefined\n\n  if (observerSingleton) return observerSingleton\n\n  const callbacks = new Map<Element, Set<UseResizeObserverCallback>>()\n\n  const observer = new ResizeObserver((entries) => {\n    for (const entry of entries)\n      callbacks.get(entry.target)?.forEach((cb) =>\n        setTimeout(() => {\n          cb(entry)\n        }, 0),\n      )\n  })\n\n  observerSingleton = {\n    observer,\n    subscribe(target, callback) {\n      let cbs = callbacks.get(target)\n\n      if (!cbs) {\n        // If target has no observers yet - register it\n        cbs = new Set<UseResizeObserverCallback>()\n        callbacks.set(target, cbs)\n        observer.observe(target)\n      }\n\n      // As Set is duplicate-safe - simply add callback on each call\n      cbs.add(callback)\n    },\n    unsubscribe(target, callback) {\n      const cbs = callbacks.get(target)\n\n      // Else branch should never occur in case of normal execution\n      // because callbacks map is hidden in closure - it is impossible to\n      // simulate situation with non-existent `cbs` Set\n      /* istanbul ignore else */\n      if (cbs) {\n        // Remove current observer\n        cbs.delete(callback)\n\n        if (cbs.size === 0) {\n          // If no observers left unregister target completely\n          callbacks.delete(target)\n          observer.unobserve(target)\n        }\n      }\n    },\n  }\n\n  return observerSingleton\n}\n\n/**\n * Invokes a callback whenever ResizeObserver detects a change to target's size.\n *\n * @param target React reference or Element to track.\n * @param callback Callback that will be invoked on resize.\n * @param enabled Whether resize observer is enabled or not.\n */\nexport function useResizeObserver<T extends Element>(\n  target: RefObject<T | null>,\n  callback: UseResizeObserverCallback,\n  enabled = true,\n): void {\n  const ro = enabled && getResizeObserver()\n  const cb = useRef(callback)\n  useEffect(() => {\n    cb.current = callback\n  }, [callback])\n\n  const tgt = target && 'current' in target ? target.current : target\n\n  useEffect(() => {\n    // This secondary target resolve required for case when we receive ref object, which, most\n    // likely, contains null during render stage, but already populated with element during\n    // effect stage.\n\n    const _tgt = target && 'current' in target ? target.current : target\n\n    if (!ro || !_tgt) return undefined\n\n    // As unsubscription in internals of our ResizeObserver abstraction can\n    // happen a bit later than effect cleanup invocation - we need a marker,\n    // that this handler should not be invoked anymore\n    let subscribed = true\n\n    const handler: UseResizeObserverCallback = (...args) => {\n      // It is reinsurance for the highly asynchronous invocations, almost\n      // impossible to achieve in tests, thus excluding from LOC\n      /* istanbul ignore else */\n      if (subscribed) {\n        cb.current(...args)\n      }\n    }\n\n    ro.subscribe(_tgt, handler)\n\n    return () => {\n      subscribed = false\n      ro.unsubscribe(_tgt, handler)\n    }\n    // oxlint-disable-next-line react/exhaustive-deps -- callback is kept current via cb.current\n  }, [tgt, ro])\n}\n","import {getImageDimensions} from '@sanity/asset-utils'\nimport {createImageUrlBuilder} from '@sanity/image-url'\nimport {Card, Flex, Stack} from '@sanity/ui'\nimport {randomKey} from '@sanity/util/content'\nimport get from 'lodash-es/get.js'\nimport {type MouseEvent, type ReactNode, useCallback, useMemo, useRef, useState} from 'react'\nimport {\n  type ArrayOfObjectsInputProps,\n  type ImageValue,\n  insert,\n  type ObjectSchemaType,\n  PatchEvent,\n  set,\n  setIfMissing,\n  useClient,\n  useFormValue,\n  useResolveInitialValueForType,\n} from 'sanity'\n\nimport Feedback from './Feedback'\nimport {type ImageHotspotOptions} from './plugin'\nimport Spot from './Spot'\nimport {useDebouncedCallback} from './useDebouncedCallback'\nimport {useResizeObserver} from './useResizeObserver'\n\nconst imageStyle = {width: `100%`, height: `auto`}\n\nconst VALID_ROOT_PATHS = ['document', 'parent']\n\nexport type FnHotspotMove = (key: string, x: number, y: number) => void\n\nexport type HotspotItem<HotspotFields = {[key: string]: unknown}> = {\n  _key: string\n  _type: string\n  x: number\n  y: number\n} & HotspotFields\n\nexport function ImageHotspotArray(\n  props: ArrayOfObjectsInputProps<HotspotItem> & {imageHotspotOptions: ImageHotspotOptions},\n): ReactNode {\n  const {value, onChange, imageHotspotOptions, schemaType, renderPreview} = props\n\n  const sanityClient = useClient({apiVersion: '2022-01-01'})\n\n  const imageHotspotPathRoot = useMemo(() => {\n    const pathRoot = VALID_ROOT_PATHS.includes(imageHotspotOptions.pathRoot ?? '')\n      ? imageHotspotOptions.pathRoot\n      : 'document'\n    return pathRoot === 'document' ? [] : props.path.slice(0, -1)\n  }, [imageHotspotOptions.pathRoot, props.path])\n\n  const rootObject = useFormValue(imageHotspotPathRoot)\n\n  const resolveInitialValueForType = useResolveInitialValueForType()\n  const resolveInitialValue = useCallback(\n    async (type: ObjectSchemaType) => {\n      return resolveInitialValueForType(type, {})\n        .then((initialValue) => {\n          return initialValue\n        })\n        .catch(() => {\n          return undefined\n        })\n    },\n    [resolveInitialValueForType],\n  )\n\n  /**\n   * Finding the image from the imageHotspotPathRoot (defaults to document),\n   * using the path from the hotspot's `options` field\n   *\n   * when changes in imageHotspotPathRoot (e.g. document) occur,\n   * check if there are any changes to the hotspotImage and update the reference\n   */\n  const hotspotImage = useMemo(() => {\n    // oxlint-disable-next-line typescript-eslint/no-unsafe-type-assertion -- the configured imagePath is expected to point to an image field\n    return (\n      imageHotspotOptions.imagePath ? get(rootObject, imageHotspotOptions.imagePath) : rootObject\n    ) as ImageValue | undefined\n  }, [rootObject, imageHotspotOptions.imagePath])\n\n  const displayImage = useMemo(() => {\n    const builder = createImageUrlBuilder(sanityClient).dataset(sanityClient.config().dataset ?? '')\n    const urlFor = (source: ImageValue) => builder.image(source)\n\n    if (hotspotImage?.asset?._ref) {\n      const {aspectRatio} = getImageDimensions(hotspotImage.asset._ref)\n      const width = 1200\n      const height = Math.round(width / aspectRatio)\n      const url = urlFor(hotspotImage).width(width).url()\n\n      return {width, height, url}\n    }\n\n    return null\n  }, [hotspotImage, sanityClient])\n\n  const handleHotspotImageClick = useCallback(\n    async (event: MouseEvent<HTMLImageElement>) => {\n      const spotType = schemaType.of[0]\n      if (!spotType) {\n        return\n      }\n\n      const {nativeEvent, currentTarget} = event\n\n      // Calculate the x/y percentage of the click position\n      const x = Number(((nativeEvent.offsetX * 100) / currentTarget.width).toFixed(2))\n      const y = Number(((nativeEvent.offsetY * 100) / currentTarget.height).toFixed(2))\n      const description = `New Hotspot at ${x}% x ${y}%`\n\n      // oxlint-disable-next-line typescript-eslint/no-unsafe-type-assertion -- hotspot arrays contain a single object type\n      const initialValues = await resolveInitialValue(spotType.type as ObjectSchemaType)\n\n      const newRow: HotspotItem = {\n        _key: randomKey(12),\n        _type: spotType.name,\n        ...initialValues,\n        x,\n        y,\n      }\n\n      if (imageHotspotOptions?.descriptionPath) {\n        newRow[imageHotspotOptions.descriptionPath] = description\n      }\n\n      onChange(PatchEvent.from([setIfMissing([]), insert([newRow], 'after', [-1])]))\n    },\n    [imageHotspotOptions, onChange, resolveInitialValue, schemaType],\n  )\n\n  const handleHotspotMove: FnHotspotMove = useCallback(\n    (key, x, y) => {\n      onChange(\n        PatchEvent.from([\n          // Set the `x` value of this array key item\n          set(x, [{_key: key}, 'x']),\n          // Set the `y` value of this array key item\n          set(y, [{_key: key}, 'y']),\n        ]),\n      )\n    },\n    [onChange],\n  )\n\n  const hotspotImageRef = useRef<HTMLImageElement | null>(null)\n\n  const [imageRect, setImageRect] = useState<DOMRectReadOnly>()\n\n  useResizeObserver<HTMLImageElement>(\n    hotspotImageRef,\n    useDebouncedCallback(\n      (e: ResizeObserverEntry) => setImageRect(e.contentRect),\n      [setImageRect],\n      200,\n    ),\n  )\n\n  return (\n    <Stack gap={[2, 2, 3]}>\n      {displayImage?.url ? (\n        <div style={{position: `relative`}}>\n          {imageRect &&\n            (value?.length ?? 0) > 0 &&\n            value?.map((spot, index) => (\n              <Spot\n                index={index}\n                key={spot._key}\n                value={spot}\n                bounds={imageRect}\n                update={handleHotspotMove}\n                hotspotDescriptionPath={imageHotspotOptions?.descriptionPath}\n                tooltip={imageHotspotOptions?.tooltip}\n                renderPreview={renderPreview}\n                // oxlint-disable-next-line typescript-eslint/no-unsafe-type-assertion -- hotspot arrays contain a single object type\n                schemaType={schemaType.of[0] as ObjectSchemaType}\n              />\n            ))}\n\n          <Card __unstable_checkered shadow={1}>\n            <Flex align=\"center\" justify=\"center\">\n              {/* oxlint-disable-next-line jsx-a11y/click-events-have-key-events, jsx-a11y/no-noninteractive-element-interactions -- hotspots are placed via pointer coordinates, which have no keyboard equivalent */}\n              <img\n                ref={hotspotImageRef}\n                src={displayImage.url}\n                width={displayImage.width}\n                height={displayImage.height}\n                alt=\"\"\n                style={imageStyle}\n                onClick={handleHotspotImageClick}\n              />\n            </Flex>\n          </Card>\n        </div>\n      ) : (\n        <Feedback>\n          {imageHotspotOptions.imagePath ? (\n            <>\n              No Hotspot image found at path <code>{imageHotspotOptions.imagePath}</code>\n            </>\n          ) : (\n            <>\n              Define a path in this field using to the image field in this document at{' '}\n              <code>options.hotspotImagePath</code>\n            </>\n          )}\n        </Feedback>\n      )}\n      {imageHotspotOptions.pathRoot && !VALID_ROOT_PATHS.includes(imageHotspotOptions.pathRoot) && (\n        <Feedback>\n          The supplied imageHotspotPathRoot &quot;{imageHotspotOptions.pathRoot}&quot; is not valid,\n          falling back to &quot;document&quot;. Available values are &quot;\n          {VALID_ROOT_PATHS.join(', ')}&quot;.\n        </Feedback>\n      )}\n      {/* oxlint-disable-next-line typescript-eslint/no-unsafe-type-assertion -- renderDefault expects the base input props */}\n      {props.renderDefault(props as unknown as ArrayOfObjectsInputProps)}\n    </Stack>\n  )\n}\n"],"mappings":";;;;;;;;;;AAEA,SAAeE,SAAAC,IAAA;CAAA,IAAAC,IAAAC,EAAA,CAAA,GAAkB,EAAAC,aAAAH,IAAuCI;CAI7D,OAJ6DH,EAAA,OAAAE,WAI7DC,KAAAH,EAAA,MAFPG,KAAA,oBAAC,MAAD;EAAe,SAAA;EAAW,QAAA;EAAW,QAAA;EAAQ,MAAA;EAC3C,UAAA,oBAAC,MAAD,EAAOD,SAAF,CAAA;CADF,CAAA,GAEEF,EAAA,KAAAE,UAAAF,EAAA,KAAAG,KAFPA;AAEO;ACSX,MAAMiB,YAA2B;CAC/BC,OAAO;CACPC,QAAQ;CACRC,UAAU;CACVC,WAAW;CACXC,KAAK;CACLC,MAAM;CACNC,QAAQ;CACRC,QAAQ;CACRC,SAAS;CACTC,gBAAgB;CAChBC,YAAY;CACZC,cAAc;CACdC,YAAY;CACZC,OAAO;AACT,GAEMC,qBAAoC;CACxCF,YAAY;CACZG,QAAQ;CACRR,QAAQ;AACV,GAEMS,sBAAqC;CACzCJ,YAAY;CACZG,QAAQ;AACV,GAEME,WAA0B;CAC9Bf,UAAU;CACVG,MAAM;CACND,KAAK;CACLH,QAAQ;CACRD,OAAO;CACPM,QAAQ;CACRM,YAAY;CACZM,YAAY;CACZP,cAAc;CAEdQ,eAAe;AACjB,GAEMC,sBAAqC,EACzCF,YAAY,UACd,GAEMG,aAA4B;CAChCR,OAAO;CACPS,UAAU;CACVC,YAAY;CACZC,YAAY;AACd,GAEMC,wBAAuC,EAC3CP,YAAY,SACd,GAEMQ,SAASC,QAAgBC,KAAKF,MAAMC,MAAM,GAAG,IAAI;AAmBvD,SAAee,KAAAC,IAAA;CAAA,IAAAC,IAAAC,EAAA,EAAA,GAAc,EAAAd,OAAAK,QAAAE,QAAAC,wBAAAC,SAAAM,kBAAAL,OAAAR,YAAAC,kBAAAS,IAU3B,CAAAI,YAAAC,iBAAoCtD,SAAS,EAAK,GAClD,CAAAuD,YAAAC,iBAAoCxD,SAAS,EAAK,GAGnByD,KAAAf,OAAMpC,SAAU+B,MAAKqB,IAAK,MAAIC;CAAA,AAAAT,EAAA,OAAAO,KAACE,KAAAT,EAAA,MAArCS,KAAA3B,MAAMyB,EAA8B,GAACP,EAAA,KAAAO,IAAAP,EAAA,KAAAS;CAA9D,IAAAD,IAAUhE,eAAeiE,EAAqC,GAC/BC,KAAAlB,OAAMnC,UAAW8B,MAAKwB,IAAK,MAAIC;CAAA,AAAAZ,EAAA,OAAAU,KAACE,KAAAZ,EAAA,MAAtCY,KAAA9B,MAAM4B,EAA+B,GAACV,EAAA,KAAAU,IAAAV,EAAA,KAAAY;CAA/D,IAAAD,IAAUnE,eAAeoE,EAAsC,GAACC;CAAA,AAAAb,EAAA,OAAAR,OAAAnC,UAAA2C,EAAA,OAAAR,OAAApC,SAAA4C,EAAA,OAAAb,MAAAqB,KAAAR,EAAA,OAAAb,MAAAwB,KAAAX,EAAA,OAAAQ,KAAAR,EAAA,OAAAW,KAKtDE,WAAA;EAERF,AADAH,EAACM,IAAKhC,MAAMU,OAAMpC,SAAU+B,MAAKqB,IAAK,IAAI,CAAC,GAC3CG,EAACG,IAAKhC,MAAMU,OAAMnC,UAAW8B,MAAKwB,IAAK,IAAI,CAAC;CAAC,GAC9CX,EAAA,KAAAR,OAAAnC,QAAA2C,EAAA,KAAAR,OAAApC,OAAA4C,EAAA,KAAAb,MAAAqB,GAAAR,EAAA,KAAAb,MAAAwB,GAAAX,EAAA,KAAAQ,GAAAR,EAAA,KAAAW,GAAAX,EAAA,MAAAa,MAAAA,KAAAb,EAAA;CAAA,IAAAe;CAHDlE,AAGCmD,EAAA,QAAAR,UAAAQ,EAAA,QAAAb,SAAAa,EAAA,QAAAQ,KAAAR,EAAA,QAAAW,KAAEI,KAAA;EAACP;EAAGG;EAAGxB;EAAOK;CAAM,GAACQ,EAAA,MAAAR,QAAAQ,EAAA,MAAAb,OAAAa,EAAA,MAAAQ,GAAAR,EAAA,MAAAW,GAAAX,EAAA,MAAAe,MAAAA,KAAAf,EAAA,KAHxBnD,UAAUgE,IAGPE,EAAqB;CAAC,IAAAC;CAAA,AAAAhB,EAAA,QAAAR,OAAAnC,UAAA2C,EAAA,QAAAR,OAAApC,SAAA4C,EAAA,QAAAN,UAAAM,EAAA,QAAAb,MAAA8B,QAAAjB,EAAA,QAAAQ,KAAAR,EAAA,QAAAW,KAESK,WAAA;EAChCZ,cAAc,EAAK;EAGnB,IAAAc,WAAiBV,EAAClE,IAAK,GACvB6E,WAAiBR,EAACrE,IAAK,GAGvB8E,OAAatC,MAAOoC,WAAW,MAAO1B,OAAMpC,KAAM,GAClDiE,OAAavC,MAAOqC,WAAW,MAAO3B,OAAMnC,MAAO,GAGnDiE,QAActC,KAAIuC,IAAK,GAAGvC,KAAIwC,IAAK,KAAKJ,IAAI,CAAC,GAC7CK,QAAczC,KAAIuC,IAAK,GAAGvC,KAAIwC,IAAK,KAAKH,IAAI,CAAC;EAE7C3B,OAAOP,MAAK8B,MAAOK,OAAOG,KAAK;CAAC,GACjCzB,EAAA,MAAAR,OAAAnC,QAAA2C,EAAA,MAAAR,OAAApC,OAAA4C,EAAA,MAAAN,QAAAM,EAAA,MAAAb,MAAA8B,MAAAjB,EAAA,MAAAQ,GAAAR,EAAA,MAAAW,GAAAX,EAAA,MAAAgB,MAAAA,KAAAhB,EAAA;CAhBD,IAAA0B,gBAAsBV,IAgBWW;CAAA,AAAA3B,EAAA,QAAA4B,OAAAC,IAAA,2BAAA,KACGF,WAAMvB,cAAc,EAAI,GAACJ,EAAA,MAAA2B,MAAAA,KAAA3B,EAAA;CAA7D,IAAA8B,kBAAwBH,IAA0CI;CAAA,AAAA/B,EAAA,QAAA4B,OAAAC,IAAA,2BAAA,KAE7BE,WAAMzB,cAAc,EAAI,GAACN,EAAA,MAAA+B,MAAAA,KAAA/B,EAAA;CAA9D,IAAAgC,mBAAyBD,IAA0CE;CAAA,AAAAjC,EAAA,QAAA4B,OAAAC,IAAA,2BAAA,KAChCI,YAAM3B,cAAc,EAAK,GAACN,EAAA,MAAAiC,OAAAA,MAAAjC,EAAA;CAA7D,IAAAkC,iBAAuBD;CAEvB,IAAI,CAACzB,KAAD,CAAOG,GAAC,OACH;CACR,IAAAwB;CAAA,AAAAnC,EAAA,QAAAG,aAgB8CgC,MAAAnC,EAAA,OAArCmC,MAAAhC,cAAA,EAAA,GAAkBjC,mBAAkB,GAAC8B,EAAA,MAAAG,YAAAH,EAAA,MAAAmC;CAAA,IAAAC;CAAA,AAAApC,EAAA,QAAAK,aACC+B,MAAApC,EAAA,OAAtCoC,MAAA/B,cAAA,EAAA,GAAkBjC,oBAAmB,GAAC4B,EAAA,MAAAK,YAAAL,EAAA,MAAAoC;CAAA,IAAAC;CAAA,AAAArC,EAAA,QAAAmC,OAAAnC,EAAA,QAAAoC,OAAApC,EAAA,QAAAQ,KAAAR,EAAA,QAAAW,KALrC0B,MAAA;EAAA,GACFlF;EAASqD;EAAAG;EAAA,GAGRwB;EAAqC,GACrCC;CACN,GAACpC,EAAA,MAAAmC,KAAAnC,EAAA,MAAAoC,KAAApC,EAAA,MAAAQ,GAAAR,EAAA,MAAAW,GAAAX,EAAA,MAAAqC,OAAAA,MAAArC,EAAA;CAAA,IAAAsC;CAAA,AAAAtC,EAAA,QAAAE,oBAAAF,EAAA,QAAAL,0BAAAK,EAAA,QAAAV,iBAAAU,EAAA,QAAAX,cAAAW,EAAA,QAAAb,SAOGmD,MAAApC,oBAAoB,OAAOA,oBAAqB,aAC9C,oBAAC,kBAAD;EAAyBf;EAAsBG;EAA2BD;CAAU,CAAA,IAEpF,oBAAC,KAAD;EAAc,SAAA;EAAU,OAAA;GAAAkD,UAAW;GAAGhE,eAAiB;EAAM;EAC3D,UAAA,oBAAC,MAAD;GAAmB,cAAA;GAChBoB,UAAAA,yBAEIrD,IAAI6C,OAAOQ,sBAAsB,IAFrC,GAGMR,MAAKqB,EAAE,MAAOrB,MAAKwB,EAAE;EAJzB,CAAA;CADH,CAAA,GAQLX,EAAA,MAAAE,kBAAAF,EAAA,MAAAL,wBAAAK,EAAA,MAAAV,eAAAU,EAAA,MAAAX,YAAAW,EAAA,MAAAb,OAAAa,EAAA,MAAAsC,OAAAA,MAAAtC,EAAA;CAAA,IAAAwC;CAAA,AAAAxC,EAAA,QAAAG,cAAAH,EAAA,QAAAK,cAQOmC,OAACrC,cAAAE,eAAD,EAAA,GAAkC7B,oBAAmB,GAACwB,EAAA,MAAAG,YAAAH,EAAA,MAAAK,YAAAL,EAAA,MAAAwC,OAAAA,MAAAxC,EAAA;CAAA,IAAAyC;CAAA,AAAAzC,EAAA,QAAAwC,MAE5DC,MAAAzC,EAAA,OALFyC,MAAA,oBAAC,KAAD,EACS,OAAA;EAAA,GACFpE;EAAQ,GACPmE;CACN,EAAC,CAAA,GACDxC,EAAA,MAAAwC,KAAAxC,EAAA,MAAAyC;CAAA,IAAAC;CAAA,AAAA1C,EAAA,QAAAG,cAAAH,EAAA,QAAAK,cAKMqC,OAACvC,cAAAE,eAAD,EAAA,GAAkCxB,sBAAqB,GAACmB,EAAA,MAAAG,YAAAH,EAAA,MAAAK,YAAAL,EAAA,MAAA0C,OAAAA,MAAA1C,EAAA;CAAA,IAAA2C;CAAA,AAAA3C,EAAA,QAAA0C,MAC7DC,MAAA3C,EAAA,OAHM2C,MAAA;EAAA,GACFlE;EAAU,GACTiE;CACN,GAAC1C,EAAA,MAAA0C,KAAA1C,EAAA,MAAA2C;CAEA,IAAAC,MAAA/C,QAAQ,GAACgD;CAAA,AAAA7C,EAAA,QAAA2C,OAAA3C,EAAA,QAAA4C,OANZC,MAAA,oBAAA,OAAA;EACS,OAAAF;EAKNC,UAAAA;CACG,CAAA,GAAA5C,EAAA,MAAA2C,KAAA3C,EAAA,MAAA4C,KAAA5C,EAAA,MAAA6C,OAAAA,MAAA7C,EAAA;CAAA,IAAA8C;CAAA,AAAA9C,EAAA,QAAAyC,OAAAzC,EAAA,QAAA6C,OAhBRC,MAAA,qBAAA,OAAA,EAAA,UAAA,CAEEL,KAOAI,GAQI,EAAA,CAAA,GAAA7C,EAAA,MAAAyC,KAAAzC,EAAA,MAAA6C,KAAA7C,EAAA,MAAA8C,OAAAA,MAAA9C,EAAA;CAAA,IAAA+C;CAAA,AAAA/C,EAAA,QAAAG,cAAAH,EAAA,QAAAsC,OAAAtC,EAAA,QAAA8C,OAAA9C,EAAA,QAAAb,MAAA8B,QApCR8B,MAAA,oBAAC,SAAD;EAEY5C,UAAAA;EACV,QAAA;EAEE,SAAAmC;EAcFQ,UAAAA;CAnBM,GACD3D,MAAK8B,IADJ,GAqCEjB,EAAA,MAAAG,YAAAH,EAAA,MAAAsC,KAAAtC,EAAA,MAAA8C,KAAA9C,EAAA,MAAAb,MAAA8B,MAAAjB,EAAA,MAAA+C,OAAAA,MAAA/C,EAAA;CAAA,IAAAgD;CACC,OADDhD,EAAA,QAAAR,UAAAQ,EAAA,QAAA0B,iBAAA1B,EAAA,QAAAqC,OAAArC,EAAA,QAAA+C,OAtDZC,MAAA,oBAAA,OAAA,KAAA;EACE,MAAA;EACiBxD,iBAAAA;EACJ,aAAA;EACC,cAAA;EACHkC,WAAAA;EACEI,aAAAA;EACCE,cAAAA;EACFE,YAAAA;EACL,OAAAG;EAQPU,UAAAA;CAsCF,CAAA,GAAa/C,EAAA,MAAAR,QAAAQ,EAAA,MAAA0B,eAAA1B,EAAA,MAAAqC,KAAArC,EAAA,MAAA+C,KAAA/C,EAAA,MAAAgD,OAAAA,MAAAhD,EAAA,KAvDbgD;AAuDa;ACnLjB,MAAagB,0BAA0Bb,aAAa;CAClDc,MAAM;CACNC,MAAM,EACJC,YAAY,EACVC,QAAQC,UAAU;EAChB,IAAIA,MAAMC,WAAWC,aAAa,WAAWF,MAAMC,WAAWE,SAAST,cAAc;GACnF,IAAMU,sBAAsBJ,MAAMC,WAAWE,SAAST;GACtD,IAAIU,qBACF,OACE,oBAAC,mBAAD;IAEE,GAAKJ;IACgBI;GAAoB,CAAA;EAIjD;EACA,OAAOJ,MAAMK,cAAcL,KAAK;CAClC,EACF,EACF;AACF,CAAC;;;;;;AC/BD,SAAAU,iBAAAC,QAAA;CAAA,IAAAC,IAAAC,EAAA,CAAA,GACEC,YAAkBL,OAAOE,MAAM,GAACI,IAAAC;CAChCT,AADgCK,EAAA,OAAAD,UAGrBI,KAAAH,EAAA,IAAAI,KAAAJ,EAAA,OAFDG,WAAA;EACRD,UAASG,UAAWN;CAAH,GAChBK,KAAA,CAACL,MAAM,GAACC,EAAA,KAAAD,QAAAC,EAAA,KAAAG,IAAAH,EAAA,KAAAI,KAFXT,UAAUQ,IAEPC,EAAQ;CAAC,IAAAE,IAAAC;CACZZ,AADYK,EAAA,OAAAQ,OAAAC,IAAA,2BAAA,KACFH,iBAAYJ,UAASG,QAAS,GAAGE,KAAA,CAAA,GAAEP,EAAA,KAAAM,IAAAN,EAAA,KAAAO,OAAAD,KAAAN,EAAA,IAAAO,KAAAP,EAAA,KAA7CL,UAAUW,IAAiCC,EAAE;AAAC;;;;;;;;;;;AAkBhD,SAAgBS,qBACdC,UACAC,MACAC,OACAC,UAAU,GACa;CACvB,IAAMC,UAAUxB,OAAsC2B,KAAAA,CAAS,GACzDC,cAAc5B,OAAsC2B,KAAAA,CAAS,GAC7DE,KAAK7B,OAAOoB,QAAQ,GACpBU,WAAW9B,OAA4D2B,KAAAA,CAAS,GAEhFI,cAAc;EAMlB,AALA,AAEEP,QAAQhB,aADRwB,aAAaR,QAAQhB,OAAO,GACVmB,KAAAA,IAGpB,AAEEC,YAAYpB,aADZwB,aAAaJ,YAAYpB,OAAO,GACVmB,KAAAA;CAE1B;CAWA,OARA1B,iBAAiB8B,KAAK,GAEtBjC,gBAAgB;EACd+B,GAAGrB,UAAUY;CAEf,GAAGC,IAAI,GAGAtB,cAAc;EACnB,IAAMkC,gBAAgB;;GAKpB,IAJAF,MAAM,GAIF,CAACD,SAAStB,SAAS;GAEvB,IAAM0B,UAAUJ,SAAStB;GAGzBqB,AAFAC,SAAStB,UAAUmB,KAAAA,GAEnBE,GAAGrB,QAAQ2B,MAAMD,QAAQnB,MAAMmB,QAAQpB,IAAI;EAC7C,GAEMsB,UAAU,SAAgB,GAAGtB,MAAM;GAWvC,AAVIU,QAAQhB,WACVwB,aAAaR,QAAQhB,OAAO,GAG9BsB,SAAStB,UAAU;IAACM;IAAMC,MAAM;GAAI,GAGpCS,QAAQhB,UAAUkB,WAAWO,SAASX,KAAK,GAGvCC,UAAU,KAAK,CAACK,YAAYpB,YAC9BoB,YAAYpB,UAAUkB,WAAWO,SAASV,OAAO;EAErD;EAOA,OALAc,OAAOC,iBAAiBF,SAAS;GAC/BG,QAAQ,EAACC,OAAOpB,SAASmB,OAAM;GAC/BE,MAAM,EAACD,OAAO,GAAGpB,SAASqB,QAAQ,YAAW,eAAgBnB,QAAO;EACtE,CAAC,GAEMc;CAET,GAAG;EAACd;EAAOC;EAAS,GAAGF;CAAI,CAAC;AAE9B;ACnGA,MAAMwB,YACJ,OAAOC,SAAW,OAClB,OAAOC,YAAc,OACrB,OAAOC,WAAa;AAUtB,IAAIY;AAEJ,SAASC,oBAAyD;CAChE,IAAI,CAAChB,WAAW;CAEhB,IAAIe,mBAAmB,OAAOA;CAE9B,IAAMG,4BAAY,IAAIC,IAA6C,GAE7DX,WAAW,IAAIC,gBAAgBY,YAAY;EAC/C,KAAK,IAAMhB,SAASgB,SAClBH,UAAUI,IAAIjB,MAAMM,MAAM,CAAC,EAAEY,SAASC,OACpCC,iBAAiB;GACfD,GAAGnB,KAAK;EACV,GAAG,CAAC,CACN;CACJ,CAAC;CAqCD,OAnCAU,oBAAoB;EAClBP;EACAE,UAAUC,QAAQE,UAAU;GAC1B,IAAIa,MAAMR,UAAUI,IAAIX,MAAM;GAU9Be,AARKA,QAEHA,sBAAM,IAAIN,IAA+B,GACzCF,UAAUS,IAAIhB,QAAQe,GAAG,GACzBlB,SAASoB,QAAQjB,MAAM,IAIzBe,IAAIG,IAAIhB,QAAQ;EAClB;EACAC,YAAYH,QAAQE,UAAU;GAC5B,IAAMa,MAAMR,UAAUI,IAAIX,MAAM;;GAMhC,AAAIe,QAEFA,IAAII,OAAOjB,QAAQ,GAEfa,IAAIK,SAAS,MAEfb,UAAUY,OAAOnB,MAAM,GACvBH,SAASwB,UAAUrB,MAAM;EAG/B;CACF,GAEOI;AACT;;;;;;;;AASA,SAAOkB,kBAAAtB,QAAAE,UAAAqB,IAAA;CAAA,IAAAC,IAAAC,EAAA,EAAA,GAGLC,UAAAH,OAAAjB,KAAAA,KAAAiB,IAAcI;CAAA,AAAAH,EAAA,OAAAE,UAE2BC,KAAAH,EAAA,MAA9BG,KAAAD,WAAWrB,kBAAkB,GAACmB,EAAA,KAAAE,SAAAF,EAAA,KAAAG;CAAzC,IAAAC,KAAWD,IACXd,KAAWzB,OAAOc,QAAQ,GAAC2B,IAAAC;CAC3B3C,AAD2BqC,EAAA,OAAAtB,YAGd2B,KAAAL,EAAA,IAAAM,KAAAN,EAAA,OAFHK,WAAA;EACRhB,GAAEkB,UAAW7B;CAAH,GACT4B,KAAA,CAAC5B,QAAQ,GAACsB,EAAA,KAAAtB,UAAAsB,EAAA,KAAAK,IAAAL,EAAA,KAAAM,KAFb3C,UAAU0C,IAEPC,EAAU;CAEb,IAAAE,MAAYhC,UAAU,aAAaA,SAASA,OAAM+B,UAAtC/B,QAAuDiC;CAAA,AAAAT,EAAA,OAAAI,MAAAJ,EAAA,OAAAxB,UAEzDiC,WAAA;EAKR,IAAAC,OAAalC,UAAU,aAAaA,SAASA,OAAM+B,UAAtC/B;EAEb,IAAI,CAAC4B,MAAD,CAAQM,MAAI;EAKhB,IAAAC,aAAiB,IAEjBC,WAA2C,GAAAC,OAAA;GAAC,IAAAC,OAAAD;GAI1C,AAAIF,cACFtB,GAAEkB,QAAQ,GAAIO,IAAI;EACnB;EAGwB,OAA3BV,GAAE7B,UAAWmC,MAAME,OAAO,SAEnB;GAELR,AADAO,aAAaA,IACbP,GAAEzB,YAAa+B,MAAME,OAAO;EAAC;CAC9B,GAEFZ,EAAA,KAAAI,IAAAJ,EAAA,KAAAxB,QAAAwB,EAAA,KAAAS,MAAAA,KAAAT,EAAA;CAAA,IAAAa;CA9BDlD,AA8BCqC,EAAA,OAAAI,MAAAJ,EAAA,OAAAQ,OAAEK,KAAA,CAACL,KAAKJ,EAAE,GAACJ,EAAA,KAAAI,IAAAJ,EAAA,KAAAQ,KAAAR,EAAA,MAAAa,MAAAA,KAAAb,EAAA,KA9BZrC,UAAU8C,IA8BPI,EAAS;AAAC;AClGf,MAAM8B,aAAa;CAACC,OAAO;CAAQC,QAAQ;AAAM,GAE3CC,mBAAmB,CAAC,YAAY,QAAQ;AAW9C,SAAOS,kBAAAC,OAAA;CAAA,IAAAC,IAAAC,EAAA,EAAA,GAGL,EAAAC,OAAAC,UAAAC,qBAAAC,YAAAC,kBAA0EP,OAAKQ;CAAA,AAAAP,EAAA,OAAAQ,OAAAC,IAAA,2BAAA,KAEhDF,KAAA,EAAAG,YAAa,aAAY,GAACV,EAAA,KAAAO,MAAAA,KAAAP,EAAA;CAAzD,IAAAW,eAAqBjC,UAAU6B,EAA0B,GAGvDK,WAAiBvB,iBAAgBwB,SAAUT,oBAAmBQ,YAAnB,EAE9B,IADTR,oBAAmBQ,WADN,YAEHE;CAAA,AAAAd,EAAA,OAAAY,YAAAZ,EAAA,OAAAD,MAAAgB,QACPD,KAAAF,aAAa,aAAb,CAAA,IAA+Bb,MAAKgB,KAAKC,MAAO,GAAG,EAAE,GAAChB,EAAA,KAAAY,UAAAZ,EAAA,KAAAD,MAAAgB,MAAAf,EAAA,KAAAc,MAAAA,KAAAd,EAAA;CAG/D,IAAAkB,aAAmBvC,aAAasC,EAAoB,GAEpDE,6BAAmCvC,8BAA8B,GAACwC;CAAA,AAAApB,EAAA,OAAAmB,6BAU/DC,KAAApB,EAAA,MARDoB,KAAA,OAAAC,SACSF,2BAA2BE,MAAM,CAAC,CAAC,CAAC,CAAAC,KACnCC,KAEL,CAAC,CAAAC,MACKC,MAEN,GACJzB,EAAA,KAAAmB,4BAAAnB,EAAA,KAAAoB;CATH,IAAAM,sBAA4BN,IAW3BO;CAAA,AAAA3B,EAAA,OAAAI,oBAAAwB,aAAA5B,EAAA,OAAAkB,cAYGS,KAAAvB,oBAAmBwB,YAAahE,IAAIsD,YAAYd,oBAAmBwB,SAAuB,IAA1FV,YAA2FlB,EAAA,KAAAI,oBAAAwB,WAAA5B,EAAA,KAAAkB,YAAAlB,EAAA,KAAA2B,MAAAA,KAAA3B,EAAA;CAH/F,IAAA6B,eAGIF,IAE2CG;CAAA,IAAA9B,EAAA,OAAA6B,gBAAA7B,EAAA,QAAAW,cAAA;EAAAoB,KAAA;GAG7C,IAAAC,UAAgBzE,sBAAsBoD,YAAY,CAAC,CAAAsB,QAAStB,aAAYuB,OAAQ,CAAC,CAAAD,WAArB,EAAmC,GAC/FE,UAAeC,WAAwBJ,QAAOK,MAAOD,MAAM;GAE3D,IAAIP,cAAYS,OAAaC,MAAA;IAAA,IAAAC;IAAA,AAAAxC,EAAA,QAAA6B,aAAAS,MAAAC,OACsCC,KAAAxC,EAAA,OAA3CwC,KAAAlF,mBAAmBuE,aAAYS,MAAMC,IAAK,GAACvC,EAAA,MAAA6B,aAAAS,MAAAC,MAAAvC,EAAA,MAAAwC;IAAjE,IAAA,EAAAC,gBAAsBD,IAA2CE;IAAA,AAAA1C,EAAA,QAAAyC,cAEnBC,KAAA1C,EAAA,OAA/B0C,KAAAC,KAAIC,MADL,OACoBH,WAAW,GAACzC,EAAA,MAAAyC,aAAAzC,EAAA,MAAA0C;IAA9C,IAAAtD,SAAesD,IACfG,MAAYV,OAAON,YAAY,CAAC,CAAA1C,MAFlB,IAE8B,CAAC,CAAA0D,IAAK,GAACC;IAEnDhB,AAFmD9B,EAAA,QAAAZ,UAAAY,EAAA,QAAA6C,OAE5CC,KAAA;KAAA3D,OAJO;KAAIC;KAAAyD;IAIQ,GAAC7C,EAAA,MAAAZ,QAAAY,EAAA,MAAA6C,KAAA7C,EAAA,MAAA8C,MAAAA,KAAA9C,EAAA,KAA3B8B,KAAOgB;IAAP,MAAAf;GAA2B;GAG7BD,KAAO;EAAI;EAAA9B,AAAAA,EAAA,KAAA6B,cAAA7B,EAAA,MAAAW,cAAAX,EAAA,MAAA8B;CAAA,OAAAA,KAAA9B,EAAA;CAbb,IAAA+C,eAAqBjB,IAcWU;CAAA,AAAAxC,EAAA,QAAAI,oBAAA4C,mBAAAhD,EAAA,QAAAG,YAAAH,EAAA,QAAA0B,uBAAA1B,EAAA,QAAAK,WAAA4C,GAAA,MAG9BT,KAAA,OAAAU,UAAA;EACE,IAAAC,WAAiB9C,WAAU4C,GAAG;EAC9B,IAAI,CAACE,UAAQ;EAIb,IAAA,EAAAC,aAAAC,kBAAqCH,OAGrC1D,IAAU8D,QAASF,YAAWG,UAAW,MAAOF,cAAalE,MAAAA,CAAMqE,QAAU,CAAC,CAAC,GAC/E/D,IAAU6D,QAASF,YAAWK,UAAW,MAAOJ,cAAajE,OAAAA,CAAOoE,QAAU,CAAC,CAAC,GAChFE,cAAoB,kBAAkBlE,EAAC,MAAOC,EAAC,IAG/CkE,gBAAsB,MAAMjC,oBAAoByB,SAAQ9B,IAAyB,GAEjFuC,SAA4B;GAAAjE,MACpBhC,UAAU,EAAE;GAACiC,OACZuD,SAAQU;GAAK,GACjBF;GAAanE;GAAAC;EAGlB;EAMAU,AAJIC,qBAAmB4C,oBACrBY,OAAOxD,oBAAmB4C,mBAAoBU,cAGhDvD,SAAS5B,WAAUuF,KAAM,CAACrF,aAAa,CAAA,CAAE,GAAGJ,OAAO,CAACuF,MAAM,GAAG,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;CAAC,GAC/E5D,EAAA,MAAAI,oBAAA4C,iBAAAhD,EAAA,MAAAG,UAAAH,EAAA,MAAA0B,qBAAA1B,EAAA,MAAAK,WAAA4C,GAAA,IAAAjD,EAAA,MAAAwC,MAAAA,KAAAxC,EAAA;CA9BH,IAAA+D,0BAAgCvB,IAgC/BE;CAAA,AAAA1C,EAAA,QAAAG,WAYEuC,KAAA1C,EAAA,OATD0C,MAAAnD,KAAAyE,KAAAC,QAAA;EACE9D,SACE5B,WAAUuF,KAAM,CAEdtF,IAAIgB,KAAG,CAAC,EAAAG,MAAOJ,IAAG,GAAG,GAAG,CAAC,GAEzBf,IAAIiB,KAAG,CAAC,EAAAE,MAAOJ,IAAG,GAAG,GAAG,CAAC,CAAC,CAC3B,CACH;CAAC,GACFS,EAAA,MAAAG,UAAAH,EAAA,MAAA0C;CAVH,IAAAwB,oBAAyCxB,IAczCyB,kBAAwBlG,OAAgC,IAAI,GAE5D,CAAAmG,WAAAC,gBAAkCnG,SAA0B,GAAC4E,IAAAwB;CAE7DrF,AAF6De,EAAA,QAAAQ,OAAAC,IAAA,2BAAA,KAKzDqC,MAAAyB,MAA4BF,aAAaE,EAACC,WAAY,GACtDF,KAAA,CAACD,YAAY,GAACrE,EAAA,MAAA8C,IAAA9C,EAAA,MAAAsE,OAAAxB,KAAA9C,EAAA,KAAAsE,KAAAtE,EAAA,MAJlBf,kBACEkF,iBACAnF,qBACE8D,IACAwB,IACA,GACF,CACF;CAAC,IAAAG;CAAA,AAAAzE,EAAA,QAAAQ,OAAAC,IAAA,2BAAA,KAGagE,KAAA;EAAC;EAAG;EAAG;CAAC,GAACzE,EAAA,MAAAyE,MAAAA,KAAAzE,EAAA;CAAA,IAAA0E;CAAA,AAAA1E,EAAA,QAAA+C,gBAAA/C,EAAA,QAAA+D,2BAAA/D,EAAA,QAAAkE,qBAAAlE,EAAA,QAAAI,oBAAA4C,mBAAAhD,EAAA,QAAAI,oBAAAwB,aAAA5B,EAAA,QAAAI,oBAAAuE,WAAA3E,EAAA,QAAAoE,aAAApE,EAAA,QAAAM,iBAAAN,EAAA,QAAAK,WAAA4C,GAAA,MAAAjD,EAAA,QAAAE,SAClBwE,MAAA3B,cAAYF,MACX,qBAAA,OAAA;EAAY,OAAA,EAAA+B,UAAW,WAAU;EAAjC,UAAA,CACGR,cACElE,OAAK2E,UAAL,KAAsB,KACvB3E,OAAK4E,KAAMC,MAAAC,UACT,oBAAC,MAAD;GACSA;GAEAD,OAAAA;GACCX,QAAAA;GACAF,QAAAA;GACgB,wBAAA9D,qBAAmB4C;GAClC,SAAA5C,qBAAmBuE;GACbrE;GAEH,YAAAD,WAAU4C,GAAG;EAAuB,GAR3C8B,KAAIpF,IAQuC,CAEnD,GAEH,oBAAC,MAAD;GAAM,sBAAA;GAA6B,QAAA;GACjC,UAAA,oBAAC,MAAD;IAAY,OAAA;IAAiB,SAAA;IAE3B,UAAA,oBAAA,OAAA;KACOwE,KAAAA;KACA,KAAApB,aAAYF;KACV,OAAAE,aAAY5D;KACX,QAAA4D,aAAY3D;KAChB,KAAA;KACGF,OAAAA;KACE6E,SAAAA;IAAuB,CAAA;GAT/B,CAAA;EADF,CAAA,CAcD;CAEN,CAAA,IAAA,oBAAC,UAAD,EAAA,UACG3D,oBAAmBwB,YAAnB,qBAAA,UAAA,EAAA,UAAA,CACG,mCAC+B,oBAAA,QAAA,EAAA,UAAOxB,oBAAmBwB,UAAkB,CAAA,CAAA,EAAA,CAAA,IAF9E,qBAAA,UAAA,EAAA,UAAA;EAKG;EACyE;EACzE,oBAAA,QAAA,EAAA,UAAM,2BAA+B,CAAA;CAAA,EAAA,CAAA,EARlC,CAAA,GAYV5B,EAAA,MAAA+C,cAAA/C,EAAA,MAAA+D,yBAAA/D,EAAA,MAAAkE,mBAAAlE,EAAA,MAAAI,oBAAA4C,iBAAAhD,EAAA,MAAAI,oBAAAwB,WAAA5B,EAAA,MAAAI,oBAAAuE,SAAA3E,EAAA,MAAAoE,WAAApE,EAAA,MAAAM,eAAAN,EAAA,MAAAK,WAAA4C,GAAA,IAAAjD,EAAA,MAAAE,OAAAF,EAAA,MAAA0E,OAAAA,MAAA1E,EAAA;CAAA,IAAAiF;CAAA,AAAAjF,EAAA,QAAAI,oBAAAQ,WAOAqE,MAAAjF,EAAA,OANAiF,MAAA7E,oBAAmBQ,YAAnB,CAAiCvB,iBAAgBwB,SAAUT,oBAAmBQ,QAAS,KACtF,qBAAC,UAAD,EAAA,UAAA;EAAU;EACiCR,oBAAmBQ;EAAU;EAErEvB,iBAAgB6F,KAAM,IAAI;EAAE;CAHtB,EAAA,CAAA,GAKVlF,EAAA,MAAAI,oBAAAQ,UAAAZ,EAAA,MAAAiF;CAEoB,IAAAE,MAAApF,OAA4CqF;CAAA,AAAApF,EAAA,QAAAD,MAAAsF,iBAAArF,EAAA,QAAAmF,OAAhEC,MAAArF,MAAKsF,cAAeF,GAA4C,GAACnF,EAAA,MAAAD,MAAAsF,eAAArF,EAAA,MAAAmF,KAAAnF,EAAA,MAAAoF,OAAAA,MAAApF,EAAA;CAAA,IAAAsF;CAC5D,OAD4DtF,EAAA,QAAA0E,OAAA1E,EAAA,QAAAiF,OAAAjF,EAAA,QAAAoF,OAzDpEE,MAAA,qBAAC,OAAD;EAAY,KAAAb;EAAZ,UAAA;GACGC;GAgDAO;GAQAG;EAzDG;KA0DEpF,EAAA,MAAA0E,KAAA1E,EAAA,MAAAiF,KAAAjF,EAAA,MAAAoF,KAAApF,EAAA,MAAAsF,OAAAA,MAAAtF,EAAA,KA1DRsF;AA0DQ;AApLL,SAAA7D,SAAA,CAAA;AAAA,SAAAF,MAAAgE,cAAA;CAAA,OAqBUA;AAAY"}
\ No newline at end of file
+{"version":3,"file":"index.js","names":["Card","Text","Feedback","t0","$","_c","children","t1","Box","Text","Tooltip","get","motion","useMotionValue","ComponentType","CSSProperties","ReactNode","useCallback","useEffect","useState","ObjectSchemaType","RenderPreviewCallback","FnHotspotMove","HotspotItem","dragStyle","width","height","position","boxSizing","top","left","margin","cursor","display","justifyContent","alignItems","borderRadius","background","color","dragStyleWhileDrag","border","dragStyleWhileHover","dotStyle","visibility","pointerEvents","dotStyleWhileActive","labelStyle","fontSize","fontWeight","lineHeight","labelStyleWhileActive","round","num","Math","HotspotTooltipProps","key","value","HotspotFields","schemaType","renderPreview","HotspotProps","bounds","DOMRectReadOnly","update","hotspotDescriptionPath","tooltip","index","Spot","t0","$","_c","TooltipComponent","isDragging","setIsDragging","isHovering","setIsHovering","t1","x","t2","t3","y","t4","t5","set","t6","t7","_key","currentX","currentY","newX","newY","safeX","max","min","safeY","handleDragEnd","t8","Symbol","for","handleDragStart","t9","handleHoverStart","t10","handleHoverEnd","t11","t12","t13","t14","maxWidth","t15","t16","t17","t18","t19","t20","t21","t22","t23","ComponentType","ArrayOfObjectsInputProps","definePlugin","HotspotItem","ImageHotspotArray","HotspotTooltipProps","ImageHotspotOptions","key","pathRoot","imagePath","descriptionPath","tooltip","HotspotFields","ArrayOptions","imageHotspot","imageHotspotArrayPlugin","name","form","components","input","props","schemaType","jsonType","options","imageHotspotOptions","renderDefault","DependencyList","useEffect","useMemo","useRef","useUnmountEffect","effect","$","_c","effectRef","t0","t1","current","t2","t3","Symbol","for","DebouncedFunction","args","this","ThisParameterType","Fn","Parameters","useDebouncedCallback","callback","deps","delay","maxWait","timeout","ReturnType","setTimeout","undefined","waitTimeout","cb","lastCall","clear","clearTimeout","execute","context","apply","wrapped","Object","defineProperties","length","value","name","RefObject","useEffect","useRef","isBrowser","window","navigator","document","UseResizeObserverCallback","entry","ResizeObserverEntry","ResizeObserverSingleton","observer","ResizeObserver","subscribe","target","Element","callback","unsubscribe","observerSingleton","getResizeObserver","undefined","callbacks","Map","Set","entries","get","forEach","cb","setTimeout","cbs","set","observe","add","delete","size","unobserve","useResizeObserver","t0","$","_c","enabled","t1","ro","t2","t3","current","tgt","t4","_tgt","subscribed","handler","t5","args","getImageDimensions","createImageUrlBuilder","Card","Flex","Stack","randomKey","get","MouseEvent","ReactNode","useCallback","useMemo","useRef","useState","ArrayOfObjectsInputProps","ImageValue","insert","ObjectSchemaType","PatchEvent","set","setIfMissing","useClient","useFormValue","useResolveInitialValueForType","Feedback","ImageHotspotOptions","Spot","useDebouncedCallback","useResizeObserver","imageStyle","width","height","VALID_ROOT_PATHS","FnHotspotMove","key","x","y","HotspotItem","_key","_type","HotspotFields","ImageHotspotArray","props","$","_c","value","onChange","imageHotspotOptions","schemaType","renderPreview","t0","Symbol","for","apiVersion","sanityClient","pathRoot","includes","t1","path","slice","imageHotspotPathRoot","rootObject","resolveInitialValueForType","t2","type","then","_temp","catch","_temp2","resolveInitialValue","t3","imagePath","hotspotImage","t4","bb0","builder","dataset","config","urlFor","source","image","asset","_ref","t5","aspectRatio","t6","Math","round","url","t7","displayImage","descriptionPath","of","event","spotType","nativeEvent","currentTarget","Number","offsetX","toFixed","offsetY","description","initialValues","newRow","name","from","handleHotspotImageClick","x_0","y_0","handleHotspotMove","hotspotImageRef","imageRect","setImageRect","t8","e","contentRect","t9","t10","tooltip","position","length","map","spot","index","t11","join","t12","t13","renderDefault","t14","initialValue"],"sources":["../src/Feedback.tsx","../src/Spot.tsx","../src/plugin.tsx","../src/useDebouncedCallback.ts","../src/useResizeObserver.ts","../src/ImageHotspotArray.tsx"],"sourcesContent":["import {Card, Text} from '@sanity/ui'\n\nexport default function Feedback({children}: {children: React.ReactNode}): React.JSX.Element {\n  return (\n    <Card padding={4} radius={2} shadow={1} tone=\"caution\">\n      <Text>{children}</Text>\n    </Card>\n  )\n}\n","import {Box, Text} from '@sanity/ui'\nimport {Tooltip} from '@sanity/ui/tooltip'\nimport get from 'lodash-es/get.js'\nimport {motion, useMotionValue} from 'motion/react'\nimport {\n  type ComponentType,\n  type CSSProperties,\n  type ReactNode,\n  useCallback,\n  useEffect,\n  useState,\n} from 'react'\nimport {type ObjectSchemaType, type RenderPreviewCallback} from 'sanity'\n\nimport {type FnHotspotMove, type HotspotItem} from './ImageHotspotArray'\n\nconst dragStyle: CSSProperties = {\n  width: '1.4rem',\n  height: '1.4rem',\n  position: 'absolute',\n  boxSizing: 'border-box',\n  top: 0,\n  left: 0,\n  margin: '-0.7rem 0 0 -0.7rem',\n  cursor: 'pointer',\n  display: 'flex',\n  justifyContent: 'center',\n  alignItems: 'center',\n  borderRadius: '50%',\n  background: '#000',\n  color: 'white',\n}\n\nconst dragStyleWhileDrag: CSSProperties = {\n  background: 'rgba(0, 0, 0, 0.1)',\n  border: '1px solid #fff',\n  cursor: 'none',\n}\n\nconst dragStyleWhileHover: CSSProperties = {\n  background: 'rgba(0, 0, 0, 0.1)',\n  border: '1px solid #fff',\n}\n\nconst dotStyle: CSSProperties = {\n  position: 'absolute',\n  left: '50%',\n  top: '50%',\n  height: '0.2rem',\n  width: '0.2rem',\n  margin: '-0.1rem 0 0 -0.1rem',\n  background: '#fff',\n  visibility: 'hidden',\n  borderRadius: '50%',\n  // make sure pointer events only run on the parent\n  pointerEvents: 'none',\n}\n\nconst dotStyleWhileActive: CSSProperties = {\n  visibility: 'visible',\n}\n\nconst labelStyle: CSSProperties = {\n  color: 'white',\n  fontSize: '0.7rem',\n  fontWeight: 600,\n  lineHeight: '1',\n}\n\nconst labelStyleWhileActive: CSSProperties = {\n  visibility: 'hidden',\n}\n\nconst round = (num: number) => Math.round(num * 100) / 100\n\nexport interface HotspotTooltipProps<HotspotFields = {[key: string]: unknown}> {\n  value: HotspotItem<HotspotFields>\n  schemaType: ObjectSchemaType\n  renderPreview: RenderPreviewCallback\n}\n\ninterface HotspotProps<HotspotFields = {[key: string]: unknown}> {\n  value: HotspotItem\n  bounds: DOMRectReadOnly\n  update: FnHotspotMove\n  hotspotDescriptionPath?: string\n  tooltip?: ComponentType<HotspotTooltipProps<HotspotFields>>\n  index: number\n  schemaType: ObjectSchemaType\n  renderPreview: RenderPreviewCallback\n}\n\nexport default function Spot({\n  value,\n  bounds,\n  update,\n  hotspotDescriptionPath,\n  tooltip: TooltipComponent,\n  index,\n  schemaType,\n  renderPreview,\n}: HotspotProps): ReactNode {\n  const [isDragging, setIsDragging] = useState(false)\n  const [isHovering, setIsHovering] = useState(false)\n\n  // x/y are stored as % but need to be converted to px\n  const x = useMotionValue(round(bounds.width * (value.x / 100)))\n  const y = useMotionValue(round(bounds.height * (value.y / 100)))\n\n  /**\n   * update x/y if the bounds change when resizing the window\n   */\n  useEffect(() => {\n    x.set(round(bounds.width * (value.x / 100)))\n    y.set(round(bounds.height * (value.y / 100)))\n  }, [x, y, value, bounds])\n\n  const handleDragEnd = useCallback(() => {\n    setIsDragging(false)\n\n    // get current values for x/y in px\n    const currentX = x.get()\n    const currentY = y.get()\n\n    // Which we need to convert back to `%` to patch the document\n    const newX = round((currentX * 100) / bounds.width)\n    const newY = round((currentY * 100) / bounds.height)\n\n    // Don't go below 0 or above 100\n    const safeX = Math.max(0, Math.min(100, newX))\n    const safeY = Math.max(0, Math.min(100, newY))\n\n    update(value._key, safeX, safeY)\n  }, [x, y, value, update, bounds])\n  const handleDragStart = useCallback(() => setIsDragging(true), [])\n\n  const handleHoverStart = useCallback(() => setIsHovering(true), [])\n  const handleHoverEnd = useCallback(() => setIsHovering(false), [])\n\n  if (!x || !y) {\n    return null\n  }\n\n  return (\n    <motion.div\n      drag\n      dragConstraints={bounds}\n      dragElastic={0}\n      dragMomentum={false}\n      onDragEnd={handleDragEnd}\n      onDragStart={handleDragStart}\n      onHoverStart={handleHoverStart}\n      onHoverEnd={handleHoverEnd}\n      style={{\n        ...dragStyle,\n        x,\n        y,\n        ...(isDragging && {...dragStyleWhileDrag}),\n        ...(isHovering && {...dragStyleWhileHover}),\n      }}\n    >\n      <Tooltip\n        key={value._key}\n        disabled={isDragging}\n        portal\n        content={\n          TooltipComponent && typeof TooltipComponent === 'function' ? (\n            <TooltipComponent value={value} renderPreview={renderPreview} schemaType={schemaType} />\n          ) : (\n            <Box padding={2} style={{maxWidth: 200, pointerEvents: `none`}}>\n              <Text textOverflow=\"ellipsis\">\n                {hotspotDescriptionPath\n                  ? // oxlint-disable-next-line typescript-eslint/no-unsafe-type-assertion -- the configured descriptionPath is expected to point to a string field\n                    (get(value, hotspotDescriptionPath) as string)\n                  : `${value.x}% x ${value.y}%`}\n              </Text>\n            </Box>\n          )\n        }\n      >\n        <div>\n          {/* Dot */}\n          <Box\n            style={{\n              ...dotStyle,\n              ...((isDragging || isHovering) && {...dotStyleWhileActive}),\n            }}\n          />\n          {/* Label */}\n          <div\n            style={{\n              ...labelStyle,\n              ...((isDragging || isHovering) && {...labelStyleWhileActive}),\n            }}\n          >\n            {index + 1}\n          </div>\n        </div>\n      </Tooltip>\n    </motion.div>\n  )\n}\n","import {type ComponentType} from 'react'\nimport {type ArrayOfObjectsInputProps, definePlugin} from 'sanity'\n\nimport {type HotspotItem, ImageHotspotArray} from './ImageHotspotArray'\nimport {type HotspotTooltipProps} from './Spot'\n\nexport interface ImageHotspotOptions<HotspotFields = {[key: string]: unknown}> {\n  pathRoot?: 'document' | 'parent'\n  imagePath: string\n  descriptionPath?: string\n  tooltip?: ComponentType<HotspotTooltipProps<HotspotFields>>\n}\n\ndeclare module 'sanity' {\n  export interface ArrayOptions {\n    imageHotspot?: ImageHotspotOptions\n  }\n}\n\nexport const imageHotspotArrayPlugin = definePlugin({\n  name: 'image-hotspot-array',\n  form: {\n    components: {\n      input: (props) => {\n        if (props.schemaType.jsonType === 'array' && props.schemaType.options?.imageHotspot) {\n          const imageHotspotOptions = props.schemaType.options?.imageHotspot\n          if (imageHotspotOptions) {\n            return (\n              <ImageHotspotArray\n                // oxlint-disable-next-line typescript-eslint/no-unsafe-type-assertion -- narrowed by the jsonType/options checks above\n                {...(props as unknown as ArrayOfObjectsInputProps<HotspotItem>)}\n                imageHotspotOptions={imageHotspotOptions}\n              />\n            )\n          }\n        }\n        return props.renderDefault(props)\n      },\n    },\n  },\n})\n","// copied from react-hookz/web\n// https://github.com/react-hookz/web/blob/579a445fcc9f4f4bb5b9d5e670b2e57448b4ee50/src/useDebouncedCallback/index.ts\nimport {type DependencyList, useEffect, useMemo, useRef} from 'react'\n\n/**\n * Run effect only when component is unmounted.\n *\n * @param effect Effector to run on unmount\n */\nfunction useUnmountEffect(effect: CallableFunction): void {\n  const effectRef = useRef(effect)\n  useEffect(() => {\n    effectRef.current = effect\n  }, [effect])\n  useEffect(() => () => effectRef.current(), [])\n}\n\nexport type DebouncedFunction<Fn extends (...args: any[]) => any> = (\n  this: ThisParameterType<Fn>,\n  ...args: Parameters<Fn>\n) => void\n\n/**\n * Makes passed function debounced, otherwise acts like `useCallback`.\n *\n * @param callback Function that will be debounced.\n * @param deps Dependencies list when to update callback. It also replaces invoked\n * \tcallback for scheduled debounced invocations.\n * @param delay Debounce delay.\n * @param maxWait The maximum time `callback` is allowed to be delayed before\n * it's invoked. 0 means no max wait.\n */\nexport function useDebouncedCallback<Fn extends (...args: any[]) => any>(\n  callback: Fn,\n  deps: DependencyList,\n  delay: number,\n  maxWait = 0,\n): DebouncedFunction<Fn> {\n  const timeout = useRef<ReturnType<typeof setTimeout>>(undefined)\n  const waitTimeout = useRef<ReturnType<typeof setTimeout>>(undefined)\n  const cb = useRef(callback)\n  const lastCall = useRef<{args: Parameters<Fn>; this: ThisParameterType<Fn>}>(undefined)\n\n  const clear = () => {\n    if (timeout.current) {\n      clearTimeout(timeout.current)\n      timeout.current = undefined\n    }\n\n    if (waitTimeout.current) {\n      clearTimeout(waitTimeout.current)\n      waitTimeout.current = undefined\n    }\n  }\n\n  // Cancel scheduled execution on unmount\n  useUnmountEffect(clear)\n\n  useEffect(() => {\n    cb.current = callback\n    // oxlint-disable-next-line react/exhaustive-deps -- deps are provided by the caller via the `deps` argument\n  }, deps)\n\n  // oxlint-disable react/react-compiler\n  return useMemo(() => {\n    const execute = () => {\n      clear()\n\n      // Barely possible to test this line\n      /* istanbul ignore next */\n      if (!lastCall.current) return\n\n      const context = lastCall.current\n      lastCall.current = undefined\n\n      cb.current.apply(context.this, context.args)\n    }\n\n    const wrapped = function (this, ...args) {\n      if (timeout.current) {\n        clearTimeout(timeout.current)\n      }\n\n      lastCall.current = {args, this: this}\n\n      // Plan regular execution\n      timeout.current = setTimeout(execute, delay)\n\n      // Plan maxWait execution if required\n      if (maxWait > 0 && !waitTimeout.current) {\n        waitTimeout.current = setTimeout(execute, maxWait)\n      }\n    } as DebouncedFunction<Fn>\n\n    Object.defineProperties(wrapped, {\n      length: {value: callback.length},\n      name: {value: `${callback.name || 'anonymous'}__debounced__${delay}`},\n    })\n\n    return wrapped\n    // oxlint-disable-next-line react/exhaustive-deps -- deps are provided by the caller via the `deps` argument\n  }, [delay, maxWait, ...deps])\n  // oxlint-enable react/react-compiler\n}\n","// copied from react-hookz/web\n// https://github.com/react-hookz/web/blob/579a445fcc9f4f4bb5b9d5e670b2e57448b4ee50/src/useResizeObserver/index.ts\nimport {type RefObject, useEffect, useRef} from 'react'\n\nconst isBrowser =\n  typeof window !== 'undefined' &&\n  typeof navigator !== 'undefined' &&\n  typeof document !== 'undefined'\n\nexport type UseResizeObserverCallback = (entry: ResizeObserverEntry) => void\n\ntype ResizeObserverSingleton = {\n  observer: ResizeObserver\n  subscribe: (target: Element, callback: UseResizeObserverCallback) => void\n  unsubscribe: (target: Element, callback: UseResizeObserverCallback) => void\n}\n\nlet observerSingleton: ResizeObserverSingleton\n\nfunction getResizeObserver(): ResizeObserverSingleton | undefined {\n  if (!isBrowser) return undefined\n\n  if (observerSingleton) return observerSingleton\n\n  const callbacks = new Map<Element, Set<UseResizeObserverCallback>>()\n\n  const observer = new ResizeObserver((entries) => {\n    for (const entry of entries)\n      callbacks.get(entry.target)?.forEach((cb) =>\n        setTimeout(() => {\n          cb(entry)\n        }, 0),\n      )\n  })\n\n  observerSingleton = {\n    observer,\n    subscribe(target, callback) {\n      let cbs = callbacks.get(target)\n\n      if (!cbs) {\n        // If target has no observers yet - register it\n        cbs = new Set<UseResizeObserverCallback>()\n        callbacks.set(target, cbs)\n        observer.observe(target)\n      }\n\n      // As Set is duplicate-safe - simply add callback on each call\n      cbs.add(callback)\n    },\n    unsubscribe(target, callback) {\n      const cbs = callbacks.get(target)\n\n      // Else branch should never occur in case of normal execution\n      // because callbacks map is hidden in closure - it is impossible to\n      // simulate situation with non-existent `cbs` Set\n      /* istanbul ignore else */\n      if (cbs) {\n        // Remove current observer\n        cbs.delete(callback)\n\n        if (cbs.size === 0) {\n          // If no observers left unregister target completely\n          callbacks.delete(target)\n          observer.unobserve(target)\n        }\n      }\n    },\n  }\n\n  return observerSingleton\n}\n\n/**\n * Invokes a callback whenever ResizeObserver detects a change to target's size.\n *\n * @param target React reference or Element to track.\n * @param callback Callback that will be invoked on resize.\n * @param enabled Whether resize observer is enabled or not.\n */\nexport function useResizeObserver<T extends Element>(\n  target: RefObject<T | null>,\n  callback: UseResizeObserverCallback,\n  enabled = true,\n): void {\n  const ro = enabled && getResizeObserver()\n  const cb = useRef(callback)\n  useEffect(() => {\n    cb.current = callback\n  }, [callback])\n\n  const tgt = target && 'current' in target ? target.current : target\n\n  useEffect(() => {\n    // This secondary target resolve required for case when we receive ref object, which, most\n    // likely, contains null during render stage, but already populated with element during\n    // effect stage.\n\n    const _tgt = target && 'current' in target ? target.current : target\n\n    if (!ro || !_tgt) return undefined\n\n    // As unsubscription in internals of our ResizeObserver abstraction can\n    // happen a bit later than effect cleanup invocation - we need a marker,\n    // that this handler should not be invoked anymore\n    let subscribed = true\n\n    const handler: UseResizeObserverCallback = (...args) => {\n      // It is reinsurance for the highly asynchronous invocations, almost\n      // impossible to achieve in tests, thus excluding from LOC\n      /* istanbul ignore else */\n      if (subscribed) {\n        cb.current(...args)\n      }\n    }\n\n    ro.subscribe(_tgt, handler)\n\n    return () => {\n      subscribed = false\n      ro.unsubscribe(_tgt, handler)\n    }\n    // oxlint-disable-next-line react/exhaustive-deps -- callback is kept current via cb.current\n  }, [tgt, ro])\n}\n","import {getImageDimensions} from '@sanity/asset-utils'\nimport {createImageUrlBuilder} from '@sanity/image-url'\nimport {Card, Flex, Stack} from '@sanity/ui'\nimport {randomKey} from '@sanity/util/content'\nimport get from 'lodash-es/get.js'\nimport {type MouseEvent, type ReactNode, useCallback, useMemo, useRef, useState} from 'react'\nimport {\n  type ArrayOfObjectsInputProps,\n  type ImageValue,\n  insert,\n  type ObjectSchemaType,\n  PatchEvent,\n  set,\n  setIfMissing,\n  useClient,\n  useFormValue,\n  useResolveInitialValueForType,\n} from 'sanity'\n\nimport Feedback from './Feedback'\nimport {type ImageHotspotOptions} from './plugin'\nimport Spot from './Spot'\nimport {useDebouncedCallback} from './useDebouncedCallback'\nimport {useResizeObserver} from './useResizeObserver'\n\nconst imageStyle = {width: `100%`, height: `auto`}\n\nconst VALID_ROOT_PATHS = ['document', 'parent']\n\nexport type FnHotspotMove = (key: string, x: number, y: number) => void\n\nexport type HotspotItem<HotspotFields = {[key: string]: unknown}> = {\n  _key: string\n  _type: string\n  x: number\n  y: number\n} & HotspotFields\n\nexport function ImageHotspotArray(\n  props: ArrayOfObjectsInputProps<HotspotItem> & {imageHotspotOptions: ImageHotspotOptions},\n): ReactNode {\n  const {value, onChange, imageHotspotOptions, schemaType, renderPreview} = props\n\n  const sanityClient = useClient({apiVersion: '2022-01-01'})\n\n  const imageHotspotPathRoot = useMemo(() => {\n    const pathRoot = VALID_ROOT_PATHS.includes(imageHotspotOptions.pathRoot ?? '')\n      ? imageHotspotOptions.pathRoot\n      : 'document'\n    return pathRoot === 'document' ? [] : props.path.slice(0, -1)\n  }, [imageHotspotOptions.pathRoot, props.path])\n\n  const rootObject = useFormValue(imageHotspotPathRoot)\n\n  const resolveInitialValueForType = useResolveInitialValueForType()\n  const resolveInitialValue = useCallback(\n    async (type: ObjectSchemaType) => {\n      return resolveInitialValueForType(type, {})\n        .then((initialValue) => {\n          return initialValue\n        })\n        .catch(() => {\n          return undefined\n        })\n    },\n    [resolveInitialValueForType],\n  )\n\n  /**\n   * Finding the image from the imageHotspotPathRoot (defaults to document),\n   * using the path from the hotspot's `options` field\n   *\n   * when changes in imageHotspotPathRoot (e.g. document) occur,\n   * check if there are any changes to the hotspotImage and update the reference\n   */\n  const hotspotImage = useMemo(() => {\n    // oxlint-disable-next-line typescript-eslint/no-unsafe-type-assertion -- the configured imagePath is expected to point to an image field\n    return (\n      imageHotspotOptions.imagePath ? get(rootObject, imageHotspotOptions.imagePath) : rootObject\n    ) as ImageValue | undefined\n  }, [rootObject, imageHotspotOptions.imagePath])\n\n  const displayImage = useMemo(() => {\n    const builder = createImageUrlBuilder(sanityClient).dataset(sanityClient.config().dataset ?? '')\n    const urlFor = (source: ImageValue) => builder.image(source)\n\n    if (hotspotImage?.asset?._ref) {\n      const {aspectRatio} = getImageDimensions(hotspotImage.asset._ref)\n      const width = 1200\n      const height = Math.round(width / aspectRatio)\n      const url = urlFor(hotspotImage).width(width).url()\n\n      return {width, height, url}\n    }\n\n    return null\n  }, [hotspotImage, sanityClient])\n\n  const handleHotspotImageClick = useCallback(\n    async (event: MouseEvent<HTMLImageElement>) => {\n      const spotType = schemaType.of[0]\n      if (!spotType) {\n        return\n      }\n\n      const {nativeEvent, currentTarget} = event\n\n      // Calculate the x/y percentage of the click position\n      const x = Number(((nativeEvent.offsetX * 100) / currentTarget.width).toFixed(2))\n      const y = Number(((nativeEvent.offsetY * 100) / currentTarget.height).toFixed(2))\n      const description = `New Hotspot at ${x}% x ${y}%`\n\n      // oxlint-disable-next-line typescript-eslint/no-unsafe-type-assertion -- hotspot arrays contain a single object type\n      const initialValues = await resolveInitialValue(spotType.type as ObjectSchemaType)\n\n      const newRow: HotspotItem = {\n        _key: randomKey(12),\n        _type: spotType.name,\n        ...initialValues,\n        x,\n        y,\n      }\n\n      if (imageHotspotOptions?.descriptionPath) {\n        newRow[imageHotspotOptions.descriptionPath] = description\n      }\n\n      onChange(PatchEvent.from([setIfMissing([]), insert([newRow], 'after', [-1])]))\n    },\n    [imageHotspotOptions, onChange, resolveInitialValue, schemaType],\n  )\n\n  const handleHotspotMove: FnHotspotMove = useCallback(\n    (key, x, y) => {\n      onChange(\n        PatchEvent.from([\n          // Set the `x` value of this array key item\n          set(x, [{_key: key}, 'x']),\n          // Set the `y` value of this array key item\n          set(y, [{_key: key}, 'y']),\n        ]),\n      )\n    },\n    [onChange],\n  )\n\n  const hotspotImageRef = useRef<HTMLImageElement | null>(null)\n\n  const [imageRect, setImageRect] = useState<DOMRectReadOnly>()\n\n  useResizeObserver<HTMLImageElement>(\n    hotspotImageRef,\n    useDebouncedCallback(\n      (e: ResizeObserverEntry) => setImageRect(e.contentRect),\n      [setImageRect],\n      200,\n    ),\n  )\n\n  return (\n    <Stack gap={[2, 2, 3]}>\n      {displayImage?.url ? (\n        <div style={{position: `relative`}}>\n          {imageRect &&\n            (value?.length ?? 0) > 0 &&\n            value?.map((spot, index) => (\n              <Spot\n                index={index}\n                key={spot._key}\n                value={spot}\n                bounds={imageRect}\n                update={handleHotspotMove}\n                hotspotDescriptionPath={imageHotspotOptions?.descriptionPath}\n                tooltip={imageHotspotOptions?.tooltip}\n                renderPreview={renderPreview}\n                // oxlint-disable-next-line typescript-eslint/no-unsafe-type-assertion -- hotspot arrays contain a single object type\n                schemaType={schemaType.of[0] as ObjectSchemaType}\n              />\n            ))}\n\n          <Card __unstable_checkered shadow={1}>\n            <Flex align=\"center\" justify=\"center\">\n              {/* oxlint-disable-next-line jsx-a11y/click-events-have-key-events, jsx-a11y/no-noninteractive-element-interactions -- hotspots are placed via pointer coordinates, which have no keyboard equivalent */}\n              <img\n                ref={hotspotImageRef}\n                src={displayImage.url}\n                width={displayImage.width}\n                height={displayImage.height}\n                alt=\"\"\n                style={imageStyle}\n                onClick={handleHotspotImageClick}\n              />\n            </Flex>\n          </Card>\n        </div>\n      ) : (\n        <Feedback>\n          {imageHotspotOptions.imagePath ? (\n            <>\n              No Hotspot image found at path <code>{imageHotspotOptions.imagePath}</code>\n            </>\n          ) : (\n            <>\n              Define a path in this field using to the image field in this document at{' '}\n              <code>options.hotspotImagePath</code>\n            </>\n          )}\n        </Feedback>\n      )}\n      {imageHotspotOptions.pathRoot && !VALID_ROOT_PATHS.includes(imageHotspotOptions.pathRoot) && (\n        <Feedback>\n          The supplied imageHotspotPathRoot &quot;{imageHotspotOptions.pathRoot}&quot; is not valid,\n          falling back to &quot;document&quot;. Available values are &quot;\n          {VALID_ROOT_PATHS.join(', ')}&quot;.\n        </Feedback>\n      )}\n      {/* oxlint-disable-next-line typescript-eslint/no-unsafe-type-assertion -- renderDefault expects the base input props */}\n      {props.renderDefault(props as unknown as ArrayOfObjectsInputProps)}\n    </Stack>\n  )\n}\n"],"mappings":"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"}
\ No newline at end of file
Index: package/dist/index.d.ts
===================================================================
--- package/dist/index.d.ts
+++ package/dist/index.d.ts
@@ -1,4 +1,5 @@
+import "@sanity/ui/styles.css";
 import { ComponentType, ReactNode } from "react";
 import { ArrayOfObjectsInputProps, ObjectSchemaType, RenderPreviewCallback } from "sanity";
 interface HotspotTooltipProps<HotspotFields = {
   [key: string]: unknown;