sanity-plugin-hotspot-array
5.0.165.0.17
~
Modified (3 files)
Index: package/dist/index.js
===================================================================
--- package/dist/index.js
+++ package/dist/index.js
@@ -158,21 +158,8 @@
style: t13,
children: t22
}), $[62] = bounds, $[63] = handleDragEnd, $[64] = t13, $[65] = t22, $[66] = t23) : t23 = $[66], t23;
}
-const imageHotspotArrayPlugin = definePlugin({
- name: "image-hotspot-array",
- form: { components: { input: (props) => {
- if (props.schemaType.jsonType === "array" && props.schemaType.options?.imageHotspot) {
- let imageHotspotOptions = props.schemaType.options?.imageHotspot;
- if (imageHotspotOptions) return /* @__PURE__ */ jsx(ImageHotspotArray, {
- ...props,
- imageHotspotOptions
- });
- }
- return props.renderDefault(props);
- } } }
-});
/**
* Run effect only when component is unmounted.
*
* @param effect Effector to run on unmount
@@ -202,9 +189,8 @@
return useUnmountEffect(clear), useEffect(() => {
cb.current = callback;
}, deps), useMemo(() => {
let execute = () => {
- /* istanbul ignore next */
if (clear(), !lastCall.current) return;
let context = lastCall.current;
lastCall.current = void 0, cb.current.apply(context.this, context.args);
}, wrapped = function(...args) {
@@ -240,9 +226,8 @@
cbs || (cbs = /* @__PURE__ */ new Set(), callbacks.set(target, cbs), observer.observe(target)), cbs.add(callback);
},
unsubscribe(target, callback) {
let cbs = callbacks.get(target);
- /* istanbul ignore else */
cbs && (cbs.delete(callback), cbs.size === 0 && (callbacks.delete(target), observer.unobserve(target)));
}
}, observerSingleton;
}
@@ -391,7 +376,20 @@
function _temp2() {}
function _temp(initialValue) {
return initialValue;
}
+const imageHotspotArrayPlugin = definePlugin({
+ name: "image-hotspot-array",
+ form: { components: { input: (props) => {
+ if (props.schemaType.jsonType === "array" && props.schemaType.options?.imageHotspot) {
+ let imageHotspotOptions = props.schemaType.options?.imageHotspot;
+ if (imageHotspotOptions) return /* @__PURE__ */ jsx(ImageHotspotArray, {
+ ...props,
+ imageHotspotOptions
+ });
+ }
+ return props.renderDefault(props);
+ } } }
+});
export { ImageHotspotArray, imageHotspotArrayPlugin };
//# sourceMappingURL=index.js.map
\ No newline at end of file Index: package/package.json
===================================================================
--- package/package.json
+++ package/package.json
@@ -1,7 +1,7 @@
{
"name": "sanity-plugin-hotspot-array",
- "version": "5.0.16",
+ "version": "5.0.17",
"description": "A configurable Custom Input for Arrays that will add and update items by clicking on an Image",
"keywords": [
"sanity",
"sanity-plugin"
@@ -40,9 +40,9 @@
"@types/lodash-es": "^4.17.12",
"@types/node": "^24.13.3",
"@types/react": "^19.2.18",
"@types/react-dom": "^19.2.4",
- "babel-plugin-react-compiler": "^1.0.0",
+ "oxc-transform-react": "^0.145.0",
"react": "^19.2.8",
"react-dom": "^19.2.8",
"sanity": "^6.10.1",
"styled-components": "^6.5.3", 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} 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/rule-suppression\n // oxlint-disable-next-line react/exhaustive-deps -- deps are provided by the caller via the `deps` argument\n }, deps)\n\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/rule-suppression\n // oxlint-disable-next-line react/exhaustive-deps -- deps are provided by the caller via the `deps` argument\n }, [delay, maxWait, ...deps])\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/rule-suppression\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":["{children}: {children: React.ReactNode}","<Card padding={4} radius={2} shadow={1} tone=\"caution\">\n <Text>{children}</Text>\n </Card>","{\n value,\n bounds,\n update,\n hotspotDescriptionPath,\n tooltip: TooltipComponent,\n index,\n schemaType,\n renderPreview,\n}: HotspotProps","round(bounds.width * (value.x / 100))","bounds.width * (value.x / 100)","round(bounds.height * (value.y / 100))","bounds.height * (value.y / 100)","() => {\n x.set(round(bounds.width * (value.x / 100)))\n y.set(round(bounds.height * (value.y / 100)))\n }","height","width","x","y","[x, y, value, bounds]","() => {\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 }","_key","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])","() => setIsDragging(true)","useCallback(() => setIsDragging(true), [])","() => setIsHovering(true)","useCallback(() => setIsHovering(true), [])","() => setIsHovering(false)","useCallback(() => setIsHovering(false), [])","isDragging && {...dragStyleWhileDrag}","isHovering && {...dragStyleWhileHover}","{\n ...dragStyle,\n x,\n y,\n ...(isDragging && {...dragStyleWhileDrag}),\n ...(isHovering && {...dragStyleWhileHover}),\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 )","(isDragging || isHovering) && {...dotStyleWhileActive}","<Box\n style={{\n ...dotStyle,\n ...((isDragging || isHovering) && {...dotStyleWhileActive}),\n }}\n />","(isDragging || isHovering) && {...labelStyleWhileActive}","{\n ...labelStyle,\n ...((isDragging || isHovering) && {...labelStyleWhileActive}),\n }","<div\n style={{\n ...labelStyle,\n ...((isDragging || isHovering) && {...labelStyleWhileActive}),\n }}\n >\n {index + 1}\n </div>","index + 1","<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>","<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>","<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>","motion.div","() => {\n effectRef.current = effect\n }","[effect]","() => () => effectRef.current()","[]","enabled = true","enabled && getResizeObserver()","() => {\n cb.current = callback\n }","[callback]","() => {\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/rule-suppression\n // oxlint-disable-next-line react/exhaustive-deps -- callback is kept current via cb.current\n }","...args","[tgt, ro]","{apiVersion: '2022-01-01'}","pathRoot === 'document' ? [] : props.path.slice(0, -1)","path","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])","async (type: ObjectSchemaType) => {\n return resolveInitialValueForType(type, {})\n .then((initialValue) => {\n return initialValue\n })\n .catch(() => {\n return undefined\n })\n }","(initialValue) => {\n return initialValue\n }","() => {\n return undefined\n }","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 )","imageHotspotOptions.imagePath ? get(rootObject, imageHotspotOptions.imagePath) : rootObject","imagePath","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])","hotspotImage?.asset?._ref","getImageDimensions(hotspotImage.asset._ref)","_ref","Math.round(width / aspectRatio)","{width, height, url}","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 }","descriptionPath","0","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 )","(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 }","x","y","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 )","(e: ResizeObserverEntry) => setImageRect(e.contentRect)","[setImageRect]","[2, 2, 3]","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 )","tooltip","value?.length","displayImage?.url","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 )","pathRoot","props.renderDefault(props as unknown as ArrayOfObjectsInputProps)","renderDefault","props as unknown as ArrayOfObjectsInputProps","<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>"],"sources":["../src/Feedback.tsx","../src/Spot.tsx","../src/useDebouncedCallback.ts","../src/useResizeObserver.ts","../src/ImageHotspotArray.tsx","../src/plugin.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","// 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/rule-suppression\n // oxlint-disable-next-line react/exhaustive-deps -- deps are provided by the caller via the `deps` argument\n }, deps)\n\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/rule-suppression\n // oxlint-disable-next-line react/exhaustive-deps -- deps are provided by the caller via the `deps` argument\n }, [delay, maxWait, ...deps])\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/rule-suppression\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","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"],"mappings":"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"}
\ No newline at end of file