sanity-plugin-hotspot-array
5.0.125.0.13
dist/index.js.map~
dist/index.js.mapModified+1−1
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 "{imageHotspotOptions.pathRoot}" is not valid,\n falling back to "document". Available values are "\n {VALID_ROOT_PATHS.join(', ')}".\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
+{"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 "{imageHotspotOptions.pathRoot}" is not valid,\n falling back to "document". Available values are "\n {VALID_ROOT_PATHS.join(', ')}".\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