{"version":3,"file":"index-Bqcw3hFZ.mjs","sources":["../../admin/src/components/ImageSelector.tsx","../../admin/src/components/HotspotMarker.tsx","../../admin/src/components/RectangleMarker.tsx","../../admin/src/components/HotspotEditor.tsx","../../admin/src/utils.ts","../../admin/src/hooks/useHotspotState.ts","../../admin/src/hooks/useRectangleDrawing.ts","../../admin/src/hooks/useHotspotOperations.ts","../../admin/src/hooks/useActionForm.ts","../../admin/src/components/ActionTypeSelector.tsx","../../admin/src/components/LinkActionFields.tsx","../../admin/src/components/ModalActionFields.tsx","../../admin/src/components/TooltipActionFields.tsx","../../admin/src/components/CallbackActionFields.tsx","../../admin/src/components/CustomActionFields.tsx","../../admin/src/components/ActionEditor.tsx","../../admin/src/components/HotspotList.tsx","../../admin/src/components/index.tsx"],"sourcesContent":["import React from \"react\";\nimport { useIntl } from \"react-intl\";\nimport { Box, Button, Flex } from \"@strapi/design-system\";\nimport { Trash, Folder } from \"@strapi/icons\";\n\ninterface ImageSelectorProps {\n  imageData: { id: number; url?: string; alternativeText?: string } | null;\n  onSelectImage: () => void;\n  onRemoveImage: () => void;\n  isMediaLibraryOpen: boolean;\n  MediaLibrary: any;\n  onCloseMediaLibrary: () => void;\n  onSelectAssets: (assets: any[]) => void;\n}\n\nexport const ImageSelector: React.FC<ImageSelectorProps> = ({\n  imageData,\n  onSelectImage,\n  onRemoveImage,\n  isMediaLibraryOpen,\n  MediaLibrary,\n  onCloseMediaLibrary,\n  onSelectAssets,\n}) => {\n  const { formatMessage } = useIntl();\n\n  return (\n    <Box>\n      <Flex gap={2} alignItems=\"flex-start\">\n        <Button\n          variant=\"secondary\"\n          startIcon={<Folder />}\n          onClick={onSelectImage}\n        >\n          {formatMessage({\n            id: \"image-hotspot.select-image\",\n            defaultMessage: \"Select Image\",\n          })}\n        </Button>\n        {imageData && (\n          <Button\n            variant=\"tertiary\"\n            startIcon={<Trash />}\n            onClick={onRemoveImage}\n          >\n            {formatMessage({\n              id: \"image-hotspot.remove-image\",\n              defaultMessage: \"Remove Image\",\n            })}\n          </Button>\n        )}\n      </Flex>\n      {isMediaLibraryOpen && MediaLibrary && (\n        <MediaLibrary\n          allowedTypes={[\"images\"]}\n          onClose={onCloseMediaLibrary}\n          onSelectAssets={onSelectAssets}\n        />\n      )}\n    </Box>\n  );\n};\n","import React, { useState, useCallback, useRef, useEffect, memo } from \"react\";\nimport { Typography } from \"@strapi/design-system\";\nimport styled from \"styled-components\";\nimport type { Hotspot } from \"../types\";\n\ninterface HotspotMarkerProps {\n  hotspot: Hotspot;\n  number: number;\n  onDrag: (id: string, x: number, y: number) => void;\n  imageRef: React.RefObject<HTMLImageElement | null>;\n}\n\ninterface MarkerContainerProps {\n  $x: number;\n  $y: number;\n  $isDragging: boolean;\n}\n\ninterface MarkerBadgeProps {\n  $isDragging: boolean;\n}\n\ninterface MarkerTextProps {\n  $fontSize: string;\n  $fontWeight: string;\n  $lineHeight: number;\n}\n\nconst MarkerContainer = styled.div<MarkerContainerProps>`\n  position: absolute;\n  left: ${(props) => props.$x}%;\n  top: ${(props) => props.$y}%;\n  transform: translate(-50%, -50%);\n  cursor: ${(props) => (props.$isDragging ? \"grabbing\" : \"grab\")};\n  z-index: 10;\n  pointer-events: auto;\n`;\n\nconst MarkerBadge = styled.div<MarkerBadgeProps>`\n  width: 32px;\n  height: 32px;\n  border-radius: 50%;\n  background: ${({ theme }) => theme.colors.primary600};\n  border: 3px solid white;\n  box-shadow:\n    0 3px 8px rgba(0, 0, 0, 0.4),\n    0 0 0 1px rgba(0, 0, 0, 0.1);\n  transition: ${(props) => (props.$isDragging ? \"none\" : \"all 0.2s ease\")};\n  display: flex;\n  align-items: center;\n  justify-content: center;\n`;\n\nconst MarkerText = styled(Typography)<MarkerTextProps>`\n  color: white;\n  font-size: ${(props) => props.$fontSize};\n  font-weight: ${(props) => props.$fontWeight};\n  line-height: ${(props) => props.$lineHeight};\n  user-select: none;\n  text-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);\n`;\n\nexport const HotspotMarker: React.FC<HotspotMarkerProps> = ({\n  hotspot,\n  number,\n  onDrag,\n  imageRef,\n}) => {\n  const [isDragging, setIsDragging] = useState(false);\n  const markerRef = useRef<HTMLDivElement>(null);\n  const onDragRef = useRef(onDrag);\n  const hotspotRef = useRef(hotspot);\n\n  // Keep refs up to date\n  useEffect(() => {\n    onDragRef.current = onDrag;\n    hotspotRef.current = hotspot;\n  }, [onDrag, hotspot]);\n\n  const handleMouseDown = useCallback((e: React.MouseEvent) => {\n    e.stopPropagation();\n    e.preventDefault();\n    setIsDragging(true);\n  }, []);\n\n  useEffect(() => {\n    if (!isDragging || !imageRef.current || !markerRef.current) return;\n\n    const handleMouseMove = (e: MouseEvent) => {\n      if (!imageRef.current) return;\n\n      const rect = imageRef.current.getBoundingClientRect();\n      const x = ((e.clientX - rect.left) / rect.width) * 100;\n      const y = ((e.clientY - rect.top) / rect.height) * 100;\n\n      onDragRef.current(hotspotRef.current.id, x, y);\n    };\n\n    const handleMouseUp = () => {\n      setIsDragging(false);\n    };\n\n    document.addEventListener(\"mousemove\", handleMouseMove);\n    document.addEventListener(\"mouseup\", handleMouseUp);\n\n    return () => {\n      document.removeEventListener(\"mousemove\", handleMouseMove);\n      document.removeEventListener(\"mouseup\", handleMouseUp);\n    };\n  }, [isDragging, imageRef]);\n  return (\n    <MarkerContainer\n      ref={markerRef}\n      $x={hotspot.x}\n      $y={hotspot.y}\n      $isDragging={isDragging}\n      onMouseDown={handleMouseDown}\n      onClick={(e: React.MouseEvent) => {\n        e.stopPropagation();\n      }}\n    >\n      <MarkerBadge $isDragging={isDragging}>\n        <MarkerText\n          variant=\"pi\"\n          $fontSize=\"14px\"\n          $fontWeight=\"700\"\n          $lineHeight={1}\n        >\n          {number}\n        </MarkerText>\n      </MarkerBadge>\n    </MarkerContainer>\n  );\n};\n","import React, { useState, useCallback, useRef, useEffect, memo } from \"react\";\nimport { Typography } from \"@strapi/design-system\";\nimport styled from \"styled-components\";\nimport type { Hotspot } from \"../types\";\n\ninterface RectangleMarkerProps {\n  hotspot: Hotspot;\n  number: number;\n  onDrag: (id: string, x: number, y: number) => void;\n  onResize: (id: string, width: number, height: number) => void;\n  imageRef: React.RefObject<HTMLImageElement | null>;\n}\n\ninterface MarkerContainerProps {\n  $x: number;\n  $y: number;\n  $width: number;\n  $height: number;\n  $isDragging: boolean;\n}\n\ninterface NumberLabelProps {\n  $zIndex: number;\n}\n\ninterface ResizeHandleProps {\n  $zIndex: number;\n}\n\ninterface NumberTextProps {\n  $fontSize: string;\n  $fontWeight: string;\n  $lineHeight: number;\n}\n\nconst MarkerContainer = styled.div<MarkerContainerProps>`\n  position: absolute;\n  left: ${(props) => props.$x}%;\n  top: ${(props) => props.$y}%;\n  width: ${(props) => props.$width}%;\n  height: ${(props) => props.$height}%;\n  border: 2px solid ${({ theme }) => theme.colors.primary600};\n  background: rgba(0, 123, 255, 0.1);\n  cursor: ${(props) => (props.$isDragging ? \"grabbing\" : \"grab\")};\n  z-index: 10;\n  box-sizing: border-box;\n`;\n\nconst NumberLabel = styled.div<NumberLabelProps>`\n  position: absolute;\n  top: -16px;\n  left: -16px;\n  width: 32px;\n  height: 32px;\n  border-radius: 50%;\n  border: 3px solid white;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  box-shadow:\n    0 3px 8px rgba(0, 0, 0, 0.4),\n    0 0 0 1px rgba(0, 0, 0, 0.1);\n  z-index: ${(props) => props.$zIndex};\n  pointer-events: none;\n  background: ${({ theme }) => theme.colors.primary600};\n`;\n\nconst NumberText = styled(Typography)<NumberTextProps>`\n  color: white;\n  font-size: ${(props) => props.$fontSize};\n  font-weight: ${(props) => props.$fontWeight};\n  line-height: ${(props) => props.$lineHeight};\n  user-select: none;\n  text-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);\n`;\n\nconst ResizeHandle = styled.div<ResizeHandleProps>`\n  position: absolute;\n  right: -6px;\n  bottom: -6px;\n  width: 12px;\n  height: 12px;\n  background: ${({ theme }) => theme.colors.primary600};\n  border: 2px solid white;\n  border-radius: 2px;\n  cursor: nwse-resize;\n  z-index: ${(props) => props.$zIndex};\n`;\n\nexport const RectangleMarker: React.FC<RectangleMarkerProps> = ({\n  hotspot,\n  number,\n  onDrag,\n  onResize,\n  imageRef,\n}) => {\n  const [isDragging, setIsDragging] = useState(false);\n  const [isResizing, setIsResizing] = useState(false);\n  const [resizeStart, setResizeStart] = useState<{\n    x: number;\n    y: number;\n    width: number;\n    height: number;\n  } | null>(null);\n  const [dragStart, setDragStart] = useState<{\n    mouseX: number;\n    mouseY: number;\n    rectX: number;\n    rectY: number;\n  } | null>(null);\n  const markerRef = useRef<HTMLDivElement>(null);\n  const onDragRef = useRef(onDrag);\n  const onResizeRef = useRef(onResize);\n  const hotspotRef = useRef(hotspot);\n\n  // Keep refs up to date\n  useEffect(() => {\n    onDragRef.current = onDrag;\n    onResizeRef.current = onResize;\n    hotspotRef.current = hotspot;\n  }, [onDrag, onResize, hotspot]);\n\n  const handleMouseDown = useCallback(\n    (e: React.MouseEvent) => {\n      e.stopPropagation();\n      e.preventDefault();\n      const target = e.target as HTMLElement;\n      if (target.classList.contains(\"resize-handle\")) {\n        setIsResizing(true);\n        setResizeStart({\n          x: hotspotRef.current.x,\n          y: hotspotRef.current.y,\n          width: hotspotRef.current.width || 0,\n          height: hotspotRef.current.height || 0,\n        });\n      } else {\n        if (!imageRef.current) return;\n        const rect = imageRef.current.getBoundingClientRect();\n        const mouseX = ((e.clientX - rect.left) / rect.width) * 100;\n        const mouseY = ((e.clientY - rect.top) / rect.height) * 100;\n\n        setIsDragging(true);\n        setDragStart({\n          mouseX,\n          mouseY,\n          rectX: hotspotRef.current.x,\n          rectY: hotspotRef.current.y,\n        });\n      }\n    },\n    [imageRef],\n  );\n\n  useEffect(() => {\n    if ((!isDragging && !isResizing) || !imageRef.current || !markerRef.current)\n      return;\n\n    const handleMouseMove = (e: MouseEvent) => {\n      if (!imageRef.current) return;\n\n      const rect = imageRef.current.getBoundingClientRect();\n      const currentX = ((e.clientX - rect.left) / rect.width) * 100;\n      const currentY = ((e.clientY - rect.top) / rect.height) * 100;\n\n      if (isDragging && dragStart) {\n        const offsetX = currentX - dragStart.mouseX;\n        const offsetY = currentY - dragStart.mouseY;\n        const newX = dragStart.rectX + offsetX;\n        const newY = dragStart.rectY + offsetY;\n\n        onDragRef.current(hotspotRef.current.id, newX, newY);\n      } else if (isResizing && resizeStart) {\n        const newWidth = Math.max(1, currentX - hotspotRef.current.x);\n        const newHeight = Math.max(1, currentY - hotspotRef.current.y);\n        onResizeRef.current(hotspotRef.current.id, newWidth, newHeight);\n      }\n    };\n\n    const handleMouseUp = () => {\n      setIsDragging(false);\n      setIsResizing(false);\n      setResizeStart(null);\n      setDragStart(null);\n    };\n\n    document.addEventListener(\"mousemove\", handleMouseMove);\n    document.addEventListener(\"mouseup\", handleMouseUp);\n\n    return () => {\n      document.removeEventListener(\"mousemove\", handleMouseMove);\n      document.removeEventListener(\"mouseup\", handleMouseUp);\n    };\n  }, [isDragging, isResizing, resizeStart, dragStart]);\n\n  return (\n    <MarkerContainer\n      ref={markerRef}\n      $x={hotspot.x}\n      $y={hotspot.y}\n      $width={hotspot.width || 0}\n      $height={hotspot.height || 0}\n      $isDragging={isDragging}\n      onMouseDown={handleMouseDown}\n    >\n      <NumberLabel $zIndex={12}>\n        <NumberText\n          variant=\"pi\"\n          $fontSize=\"14px\"\n          $fontWeight=\"700\"\n          $lineHeight={1}\n        >\n          {number}\n        </NumberText>\n      </NumberLabel>\n      <ResizeHandle className=\"resize-handle\" $zIndex={11} />\n    </MarkerContainer>\n  );\n};\n","import React, { RefObject } from \"react\";\nimport { useIntl } from \"react-intl\";\nimport { Box, Button, Flex, Typography } from \"@strapi/design-system\";\nimport styled from \"styled-components\";\nimport type { HotspotType, Hotspot, Image } from \"../types\";\nimport { HotspotMarker } from \"./HotspotMarker\";\nimport { RectangleMarker } from \"./RectangleMarker\";\n\ninterface HotspotEditorProps {\n  imageUrl: string;\n  imageData: Image;\n  hotspots: Hotspot[];\n  selectionMode: HotspotType;\n  isDrawingRectangle: boolean;\n  currentRectangle: {\n    x: number;\n    y: number;\n    width: number;\n    height: number;\n  } | null;\n  error?: string;\n  imageRef: RefObject<HTMLImageElement | null>;\n  onImageMouseDown: (event: React.MouseEvent<HTMLImageElement>) => void;\n  onHotspotDrag: (id: string, newX: number, newY: number) => void;\n  onRectangleResize: (id: string, newWidth: number, newHeight: number) => void;\n  onSelectionModeChange: (mode: HotspotType) => void;\n}\n\ninterface ImageContainerProps {\n  $position: string;\n}\n\ninterface HotspotImageProps {\n  $cursor: string;\n  $zIndex: number;\n}\n\ninterface DrawingRectangleProps {\n  $x: number;\n  $y: number;\n  $width: number;\n  $height: number;\n  $zIndex: number;\n}\n\nconst ImageContainer = styled.div<ImageContainerProps>`\n  position: ${(props) => props.$position};\n  display: inline-block;\n  overflow: auto;\n`;\n\nconst HotspotImage = styled.img<HotspotImageProps>`\n  display: block;\n  cursor: ${(props) => props.$cursor};\n  user-select: none;\n  pointer-events: auto;\n  max-width: initial;\n  position: relative;\n  z-index: ${(props) => props.$zIndex};\n`;\n\nconst DrawingRectangle = styled.div<DrawingRectangleProps>`\n  position: absolute;\n  left: ${(props) => props.$x}%;\n  top: ${(props) => props.$y}%;\n  width: ${(props) => props.$width}%;\n  height: ${(props) => props.$height}%;\n  border: 2px dashed ${({ theme }) => theme.colors.primary600};\n  background: rgba(0, 123, 255, 0.1);\n  pointer-events: none;\n  z-index: ${(props) => props.$zIndex};\n`;\n\nexport const HotspotEditor: React.FC<HotspotEditorProps> = ({\n  imageUrl,\n  imageData,\n  hotspots,\n  selectionMode,\n  isDrawingRectangle,\n  currentRectangle,\n  error,\n  imageRef,\n  onImageMouseDown,\n  onHotspotDrag,\n  onRectangleResize,\n  onSelectionModeChange,\n}) => {\n  const { formatMessage } = useIntl();\n  const containerRef = React.useRef<HTMLDivElement>(null);\n\n  return (\n    <Box\n      ref={containerRef}\n      position=\"relative\"\n      marginTop={4}\n      padding={4}\n      background=\"neutral100\"\n      borderRadius=\"4px\"\n      borderColor={error ? \"danger600\" : \"neutral200\"}\n      borderStyle=\"solid\"\n      borderWidth=\"1px\"\n    >\n      {/* Selection Mode Toggle */}\n      <Box marginBottom={3}>\n        <Flex gap={3} alignItems=\"center\">\n          <Typography variant=\"pi\" fontWeight=\"semiBold\">\n            {formatMessage({\n              id: \"image-hotspot.selection-mode\",\n              defaultMessage: \"Selection Mode:\",\n            })}\n          </Typography>\n          <Flex gap={2}>\n            <Button\n              variant={selectionMode === \"point\" ? \"default\" : \"tertiary\"}\n              size=\"S\"\n              onClick={() => onSelectionModeChange(\"point\")}\n            >\n              {formatMessage({\n                id: \"image-hotspot.point-mode\",\n                defaultMessage: \"Point\",\n              })}\n            </Button>\n            <Button\n              variant={selectionMode === \"rectangle\" ? \"default\" : \"tertiary\"}\n              size=\"S\"\n              onClick={() => onSelectionModeChange(\"rectangle\")}\n            >\n              {formatMessage({\n                id: \"image-hotspot.rectangle-mode\",\n                defaultMessage: \"Rectangle\",\n              })}\n            </Button>\n          </Flex>\n        </Flex>\n      </Box>\n\n      <Box width=\"100%\" overflow=\"auto\">\n        <ImageContainer $position=\"relative\">\n          <HotspotImage\n            ref={imageRef}\n            src={imageUrl || \"\"}\n            width={imageData?.width}\n            height={imageData?.height}\n            alt={imageData?.alternativeText || \"Image with hotspots\"}\n            onMouseDown={onImageMouseDown}\n            $cursor=\"crosshair\"\n            $zIndex={1}\n          />\n          {isDrawingRectangle && currentRectangle && (\n            <DrawingRectangle\n              $x={currentRectangle.x}\n              $y={currentRectangle.y}\n              $width={currentRectangle.width}\n              $height={currentRectangle.height}\n              $zIndex={5}\n            />\n          )}\n          {hotspots.map((hotspot, index) =>\n            hotspot.type === \"point\" ? (\n              <HotspotMarker\n                key={hotspot.id}\n                hotspot={hotspot}\n                number={index + 1}\n                onDrag={onHotspotDrag}\n                imageRef={imageRef}\n              />\n            ) : (\n              <RectangleMarker\n                key={hotspot.id}\n                hotspot={hotspot}\n                number={index + 1}\n                onDrag={onHotspotDrag}\n                onResize={onRectangleResize}\n                imageRef={imageRef}\n              />\n            ),\n          )}\n        </ImageContainer>\n      </Box>\n\n      <Box marginTop={2}>\n        <Typography variant=\"pi\" textColor=\"neutral600\">\n          {selectionMode === \"point\"\n            ? formatMessage({\n                id: \"image-hotspot.instruction-point\",\n                defaultMessage: \"Click on the image to add a point\",\n              })\n            : formatMessage({\n                id: \"image-hotspot.instruction-rectangle\",\n                defaultMessage:\n                  \"Click and drag on the image to draw a rectangle\",\n              })}\n        </Typography>\n      </Box>\n    </Box>\n  );\n};\n","import type { Hotspot, HotspotType } from \"./types\";\n\n/**\n * Clamps a value between min and max\n */\nexport const clamp = (value: number, min: number, max: number): number => {\n  return Math.max(min, Math.min(max, value));\n};\n\n/**\n * Converts mouse coordinates to percentage coordinates relative to an element\n */\nexport const getPercentageCoordinates = (\n  clientX: number,\n  clientY: number,\n  element: HTMLElement,\n): { x: number; y: number } => {\n  const rect = element.getBoundingClientRect();\n  const x = ((clientX - rect.left) / rect.width) * 100;\n  const y = ((clientY - rect.top) / rect.height) * 100;\n  return {\n    x: clamp(x, 0, 100),\n    y: clamp(y, 0, 100),\n  };\n};\n\n/**\n * Generates a unique hotspot ID\n */\nexport const generateHotspotId = (): string => {\n  return `hotspot-${Date.now()}-${Math.random()}`;\n};\n\n/**\n * Creates a new point hotspot\n */\nexport const createPointHotspot = (\n  x: number,\n  y: number,\n  existingHotspots: Hotspot[],\n): Hotspot => {\n  const pointCount = existingHotspots.filter((h) => h.type === \"point\").length;\n  return {\n    id: generateHotspotId(),\n    type: \"point\",\n    x: clamp(x, 0, 100),\n    y: clamp(y, 0, 100),\n    label: `Point ${pointCount + 1}`,\n  };\n};\n\n/**\n * Creates a new rectangle hotspot\n */\nexport const createRectangleHotspot = (\n  x: number,\n  y: number,\n  width: number,\n  height: number,\n  existingHotspots: Hotspot[],\n): Hotspot => {\n  const rectangleCount = existingHotspots.filter(\n    (h) => h.type === \"rectangle\",\n  ).length;\n  return {\n    id: generateHotspotId(),\n    type: \"rectangle\",\n    x: clamp(x, 0, 100),\n    y: clamp(y, 0, 100),\n    width: clamp(width, 0, 100 - x),\n    height: clamp(height, 0, 100 - y),\n    label: `Rectangle ${rectangleCount + 1}`,\n  };\n};\n\n/**\n * Normalizes hotspot data to ensure type is set\n */\nexport const normalizeHotspot = (hotspot: Hotspot): Hotspot => {\n  return {\n    ...hotspot,\n    type: hotspot.type || \"point\",\n  };\n};\n\n/**\n * Normalizes an array of hotspots\n */\nexport const normalizeHotspots = (hotspots: Hotspot[]): Hotspot[] => {\n  return hotspots.map(normalizeHotspot);\n};\n\n/**\n * Checks if a click target is a marker element\n */\nexport const isMarkerElement = (target: HTMLElement): boolean => {\n  const parent = target.closest('[style*=\"position: absolute\"]');\n  return parent !== null;\n};\n\n/**\n * Calculates rectangle bounds from start and current points\n */\nexport const calculateRectangleBounds = (\n  startX: number,\n  startY: number,\n  currentX: number,\n  currentY: number,\n): { x: number; y: number; width: number; height: number } => {\n  const x = Math.min(startX, currentX);\n  const y = Math.min(startY, currentY);\n  const width = Math.abs(currentX - startX);\n  const height = Math.abs(currentY - startY);\n\n  return {\n    x: clamp(x, 0, 100),\n    y: clamp(y, 0, 100),\n    width: clamp(width, 0, 100 - x),\n    height: clamp(height, 0, 100 - y),\n  };\n};\n\n/**\n * Minimum size for a valid rectangle hotspot\n */\nexport const MIN_RECTANGLE_SIZE = 1;\n\n/**\n * Checks if a rectangle has valid dimensions\n */\nexport const isValidRectangle = (width: number, height: number): boolean => {\n  return width > MIN_RECTANGLE_SIZE && height > MIN_RECTANGLE_SIZE;\n};\n","import { useCallback, useState } from \"react\";\nimport { useEffect } from \"react\";\nimport { Hotspot, Image, ImageHotspotValue } from \"../types\";\nimport { normalizeHotspots } from \"../utils\";\n\nexport const useHotspotState = (\n  initialValue: ImageHotspotValue | null | undefined,\n  name: string,\n  onChange: (event: {\n    target: { name: string; value: ImageHotspotValue | null; type?: string };\n  }) => void,\n) => {\n  const [hotspots, setHotspots] = useState<Hotspot[]>(\n    initialValue?.hotspots ? normalizeHotspots(initialValue.hotspots) : [],\n  );\n\n  const [imageData, setImageData] = useState<Image | null>(null);\n  const [imageId, setImageId] = useState<string | null>(\n    initialValue?.image || null,\n  );\n\n  useEffect(() => {\n    const fetchImageData = async () => {\n      if (imageId && typeof imageId === \"string\") {\n        try {\n          const response = await fetch(\n            `/api/upload/files?filters[documentId][$eq]=${imageId}`,\n          );\n          if (response.ok) {\n            const data = await response.json();\n            if (data.length > 0) {\n              setImageData(data[0]);\n            } else {\n              throw new Error(\"Image not found\");\n            }\n          } else {\n            console.error(\"Failed to fetch image data:\", response.statusText);\n            setImageId(null);\n            setImageData(null);\n          }\n        } catch (error) {\n          setImageData(null);\n        }\n      }\n    };\n\n    fetchImageData();\n  }, [imageId, name, onChange]);\n\n  useEffect(() => {\n    const timeout = setTimeout(() => {\n      const newValue: ImageHotspotValue | null = imageId\n        ? {\n            image: imageId,\n            hotspots: hotspots || [],\n          }\n        : null;\n      onChange({\n        target: {\n          name,\n          value: newValue,\n          type: \"json\",\n        },\n      });\n    }, 300);\n    return () => clearTimeout(timeout);\n  }, [imageId, hotspots, name, onChange]);\n\n  // When image is selected, extract the ID and store both ID and data\n  const handleImageSet = useCallback((asset: Image) => {\n    if (asset?.id) {\n      setImageId(asset.documentId);\n      setImageData(asset);\n    }\n  }, []);\n\n  const handleImageRemove = useCallback(() => {\n    setImageData(null);\n    setImageId(null);\n    setHotspots([]);\n  }, []);\n\n  return {\n    hotspots,\n    setHotspots,\n    imageData,\n    setImageData: handleImageSet,\n    imageId,\n    handleImageRemove,\n  };\n};\n","import { useCallback, useEffect, useState } from \"react\";\nimport { Hotspot, RectangleState } from \"../types\";\nimport {\n  calculateRectangleBounds,\n  createRectangleHotspot,\n  getPercentageCoordinates,\n  isValidRectangle,\n} from \"../utils\";\n\nexport const useRectangleDrawing = (\n  imageRef: React.RefObject<HTMLImageElement | null>,\n  hotspots: Hotspot[],\n  setHotspots: React.Dispatch<React.SetStateAction<Hotspot[]>>,\n) => {\n  const [rectangleState, setRectangleState] = useState<RectangleState>({\n    isDrawing: false,\n    start: null,\n    current: null,\n  });\n\n  const startRectangleDrawing = useCallback((x: number, y: number) => {\n    setRectangleState({\n      isDrawing: true,\n      start: { x, y },\n      current: { x, y, width: 0, height: 0 },\n    });\n  }, []);\n\n  const updateRectangleDrawing = useCallback(\n    (currentX: number, currentY: number) => {\n      if (!rectangleState.start) return;\n\n      const bounds = calculateRectangleBounds(\n        rectangleState.start.x,\n        rectangleState.start.y,\n        currentX,\n        currentY,\n      );\n\n      setRectangleState((prev) => ({\n        ...prev,\n        current: bounds,\n      }));\n    },\n    [rectangleState.start],\n  );\n\n  const finishRectangleDrawing = useCallback(() => {\n    if (\n      rectangleState.isDrawing &&\n      rectangleState.current &&\n      rectangleState.start\n    ) {\n      const { x, y, width, height } = rectangleState.current;\n\n      if (isValidRectangle(width, height)) {\n        const newHotspot = createRectangleHotspot(\n          x,\n          y,\n          width,\n          height,\n          hotspots,\n        );\n        setHotspots((prev) => [...prev, newHotspot]);\n      }\n    }\n\n    setRectangleState({\n      isDrawing: false,\n      start: null,\n      current: null,\n    });\n  }, [rectangleState, hotspots, setHotspots]);\n\n  // Handle mouse events for rectangle drawing\n  useEffect(() => {\n    if (!rectangleState.isDrawing || !imageRef.current) return;\n\n    const handleMouseMove = (e: MouseEvent) => {\n      if (!imageRef.current || !rectangleState.start) return;\n\n      const coords = getPercentageCoordinates(\n        e.clientX,\n        e.clientY,\n        imageRef.current,\n      );\n      updateRectangleDrawing(coords.x, coords.y);\n    };\n\n    const handleMouseUp = () => {\n      finishRectangleDrawing();\n    };\n\n    document.addEventListener(\"mousemove\", handleMouseMove);\n    document.addEventListener(\"mouseup\", handleMouseUp);\n\n    return () => {\n      document.removeEventListener(\"mousemove\", handleMouseMove);\n      document.removeEventListener(\"mouseup\", handleMouseUp);\n    };\n  }, [\n    rectangleState.isDrawing,\n    rectangleState.start,\n    imageRef,\n    updateRectangleDrawing,\n    finishRectangleDrawing,\n  ]);\n\n  return {\n    isDrawingRectangle: rectangleState.isDrawing,\n    currentRectangle: rectangleState.current,\n    startRectangleDrawing,\n  };\n};\n","import { useCallback } from \"react\";\nimport { createPointHotspot } from \"../utils\";\nimport { Hotspot, HotspotAction } from \"../types\";\n\nexport const useHotspotOperations = (\n  hotspots: Hotspot[],\n  setHotspots: React.Dispatch<React.SetStateAction<Hotspot[]>>,\n) => {\n  const handleHotspotDelete = useCallback(\n    (id: string) => {\n      setHotspots((prev) => prev.filter((h) => h.id !== id));\n    },\n    [setHotspots],\n  );\n\n  const handleHotspotDrag = useCallback(\n    (id: string, newX: number, newY: number) => {\n      setHotspots((prev) =>\n        prev.map((h) => {\n          if (h.id !== id) return h;\n\n          let updatedX: number;\n          let updatedY: number;\n\n          if (h.type === \"point\") {\n            updatedX = Math.max(0, Math.min(100, newX));\n            updatedY = Math.max(0, Math.min(100, newY));\n          } else {\n            // For rectangles, drag moves the top-left corner\n            updatedX = Math.max(0, Math.min(100 - (h.width || 0), newX));\n            updatedY = Math.max(0, Math.min(100 - (h.height || 0), newY));\n          }\n\n          // Only create a new object if coordinates actually changed\n          if (h.x === updatedX && h.y === updatedY) {\n            return h;\n          }\n\n          return {\n            ...h,\n            x: updatedX,\n            y: updatedY,\n          };\n        }),\n      );\n    },\n    [setHotspots],\n  );\n\n  const handleRectangleResize = useCallback(\n    (id: string, newWidth: number, newHeight: number) => {\n      setHotspots((prev) =>\n        prev.map((h) =>\n          h.id === id && h.type === \"rectangle\"\n            ? {\n                ...h,\n                width: Math.max(1, Math.min(100 - h.x, newWidth)),\n                height: Math.max(1, Math.min(100 - h.y, newHeight)),\n              }\n            : h,\n        ),\n      );\n    },\n    [setHotspots],\n  );\n\n  const handleActionUpdate = useCallback(\n    (id: string, action: HotspotAction | undefined) => {\n      setHotspots((prev) =>\n        prev.map((h) => (h.id === id ? { ...h, action } : h)),\n      );\n    },\n    [setHotspots],\n  );\n\n  const handleCreatePoint = useCallback(\n    (x: number, y: number) => {\n      const newHotspot = createPointHotspot(x, y, hotspots);\n      console.log(newHotspot);\n      setHotspots((prev) => [...prev, newHotspot]);\n    },\n    [hotspots, setHotspots],\n  );\n\n  return {\n    handleHotspotDelete,\n    handleHotspotDrag,\n    handleRectangleResize,\n    handleActionUpdate,\n    handleCreatePoint,\n  };\n};\n","import { useState, useEffect, useCallback } from \"react\";\nimport type { HotspotAction, HotspotActionType } from \"../types\";\n\ninterface ActionFormState {\n  url: string;\n  target: \"_self\" | \"_blank\";\n  modalTitle: string;\n  modalContent: string;\n  tooltipText: string;\n  callbackName: string;\n  callbackParams: string;\n  customName: string;\n  customPayload: string;\n  contentType: string;\n  entryId: string;\n}\n\nconst getInitialFormState = (\n  action: HotspotAction | undefined,\n): ActionFormState => ({\n  url: action?.url || \"\",\n  target: action?.target || \"_self\",\n  modalTitle: action?.modalTitle || \"\",\n  modalContent: action?.modalContent || \"\",\n  tooltipText: action?.tooltipText || \"\",\n  callbackName: action?.callbackName || \"\",\n  callbackParams: action?.callbackParams\n    ? JSON.stringify(action.callbackParams, null, 2)\n    : \"\",\n  customName: action?.customName || \"\",\n  customPayload: action?.customPayload\n    ? JSON.stringify(action.customPayload, null, 2)\n    : \"\",\n  contentType: action?.contentType || \"\",\n  entryId: action?.entryId ? String(action.entryId) : \"\",\n});\n\nexport const useActionForm = (action: HotspotAction | undefined) => {\n  const [actionType, setActionType] = useState<HotspotActionType>(\n    action?.type || \"none\",\n  );\n  const [formState, setFormState] = useState<ActionFormState>(\n    getInitialFormState(action),\n  );\n\n  useEffect(() => {\n    if (action) {\n      setActionType(action.type || \"none\");\n      setFormState(getInitialFormState(action));\n    }\n  }, [action]);\n\n  const updateActionType = useCallback((newType: HotspotActionType) => {\n    setActionType(newType);\n  }, []);\n\n  const updateField = useCallback(\n    <K extends keyof ActionFormState>(field: K, value: ActionFormState[K]) => {\n      setFormState((prev) => ({ ...prev, [field]: value }));\n    },\n    [],\n  );\n\n  const buildAction = useCallback((): HotspotAction | undefined => {\n    if (actionType === \"none\") {\n      return undefined;\n    }\n\n    const newAction: HotspotAction = {\n      type: actionType,\n    };\n\n    switch (actionType) {\n      case \"link\":\n        newAction.url = formState.url;\n        newAction.target = formState.target;\n        break;\n      case \"modal\":\n        newAction.modalTitle = formState.modalTitle;\n        newAction.modalContent = formState.modalContent;\n        break;\n      case \"tooltip\":\n        newAction.tooltipText = formState.tooltipText;\n        break;\n      case \"callback\":\n        newAction.callbackName = formState.callbackName;\n        try {\n          newAction.callbackParams = formState.callbackParams\n            ? JSON.parse(formState.callbackParams)\n            : undefined;\n        } catch {\n          newAction.callbackParams = undefined;\n        }\n        break;\n      case \"custom\":\n        newAction.customName = formState.customName;\n        try {\n          newAction.customPayload = formState.customPayload\n            ? JSON.parse(formState.customPayload)\n            : undefined;\n        } catch {\n          newAction.customPayload = undefined;\n        }\n        break;\n    }\n\n    return newAction;\n  }, [actionType, formState]);\n\n  return {\n    actionType,\n    formState,\n    updateActionType,\n    updateField,\n    buildAction,\n  };\n};\n","import React from \"react\";\nimport { useIntl } from \"react-intl\";\nimport {\n  Box,\n  SingleSelect,\n  SingleSelectOption,\n  Field,\n} from \"@strapi/design-system\";\nimport type { HotspotActionType } from \"../types\";\n\ninterface ActionTypeSelectorProps {\n  value: HotspotActionType;\n  onChange: (value: HotspotActionType) => void;\n}\n\nconst actionTypeOptions = [\n  {\n    value: \"none\",\n    id: \"image-hotspot.action-none\",\n    defaultMessage: \"No Action\",\n  },\n  { value: \"link\", id: \"image-hotspot.action-link\", defaultMessage: \"Link\" },\n  {\n    value: \"modal\",\n    id: \"image-hotspot.action-modal\",\n    defaultMessage: \"Modal\",\n  },\n  {\n    value: \"tooltip\",\n    id: \"image-hotspot.action-tooltip\",\n    defaultMessage: \"Tooltip\",\n  },\n  {\n    value: \"callback\",\n    id: \"image-hotspot.action-callback\",\n    defaultMessage: \"Callback\",\n  },\n  {\n    value: \"custom\",\n    id: \"image-hotspot.action-custom\",\n    defaultMessage: \"Custom\",\n  },\n] as const;\n\nexport const ActionTypeSelector: React.FC<ActionTypeSelectorProps> = ({\n  value,\n  onChange,\n}) => {\n  const { formatMessage } = useIntl();\n\n  return (\n    <Box marginBottom={3}>\n      <Field.Root>\n        <Field.Label>\n          {formatMessage({\n            id: \"image-hotspot.action-type\",\n            defaultMessage: \"Action Type\",\n          })}\n        </Field.Label>\n        <SingleSelect\n          value={value}\n          onChange={(val: string | number) =>\n            onChange(String(val) as HotspotActionType)\n          }\n        >\n          {actionTypeOptions.map((option) => (\n            <SingleSelectOption key={option.value} value={option.value}>\n              {formatMessage({\n                id: option.id,\n                defaultMessage: option.defaultMessage,\n              })}\n            </SingleSelectOption>\n          ))}\n        </SingleSelect>\n      </Field.Root>\n    </Box>\n  );\n};\n","import React from \"react\";\nimport { useIntl } from \"react-intl\";\nimport {\n  Box,\n  TextInput,\n  SingleSelect,\n  SingleSelectOption,\n  Field,\n} from \"@strapi/design-system\";\n\ninterface LinkActionFieldsProps {\n  url: string;\n  target: \"_self\" | \"_blank\";\n  onUrlChange: (url: string) => void;\n  onTargetChange: (target: \"_self\" | \"_blank\") => void;\n}\n\nexport const LinkActionFields: React.FC<LinkActionFieldsProps> = ({\n  url,\n  target,\n  onUrlChange,\n  onTargetChange,\n}) => {\n  const { formatMessage } = useIntl();\n\n  return (\n    <>\n      <Box marginBottom={3}>\n        <Field.Root>\n          <Field.Label>\n            {formatMessage({\n              id: \"image-hotspot.action-link-url\",\n              defaultMessage: \"URL\",\n            })}\n          </Field.Label>\n          <TextInput\n            value={url}\n            onChange={(e: React.ChangeEvent<HTMLInputElement>) =>\n              onUrlChange(e.target.value)\n            }\n            placeholder=\"https://example.com\"\n          />\n        </Field.Root>\n      </Box>\n      <Box marginBottom={3}>\n        <Field.Root>\n          <Field.Label>\n            {formatMessage({\n              id: \"image-hotspot.action-link-target\",\n              defaultMessage: \"Target\",\n            })}\n          </Field.Label>\n          <SingleSelect\n            value={target}\n            onChange={(val: string | number) =>\n              onTargetChange(String(val) as \"_self\" | \"_blank\")\n            }\n          >\n            <SingleSelectOption value=\"_self\">\n              {formatMessage({\n                id: \"image-hotspot.action-link-target-self\",\n                defaultMessage: \"Same Window\",\n              })}\n            </SingleSelectOption>\n            <SingleSelectOption value=\"_blank\">\n              {formatMessage({\n                id: \"image-hotspot.action-link-target-blank\",\n                defaultMessage: \"New Window\",\n              })}\n            </SingleSelectOption>\n          </SingleSelect>\n        </Field.Root>\n      </Box>\n    </>\n  );\n};","import React from \"react\";\nimport { useIntl } from \"react-intl\";\nimport { Box, TextInput, Textarea, Field } from \"@strapi/design-system\";\n\ninterface ModalActionFieldsProps {\n  title: string;\n  content: string;\n  onTitleChange: (title: string) => void;\n  onContentChange: (content: string) => void;\n}\n\nexport const ModalActionFields: React.FC<ModalActionFieldsProps> = ({\n  title,\n  content,\n  onTitleChange,\n  onContentChange,\n}) => {\n  const { formatMessage } = useIntl();\n\n  return (\n    <>\n      <Box marginBottom={3}>\n        <Field.Root>\n          <Field.Label>\n            {formatMessage({\n              id: \"image-hotspot.action-modal-title\",\n              defaultMessage: \"Modal Title\",\n            })}\n          </Field.Label>\n          <TextInput\n            value={title}\n            onChange={(e: React.ChangeEvent<HTMLInputElement>) =>\n              onTitleChange(e.target.value)\n            }\n          />\n        </Field.Root>\n      </Box>\n      <Box marginBottom={3}>\n        <Field.Root>\n          <Field.Label>\n            {formatMessage({\n              id: \"image-hotspot.action-modal-content\",\n              defaultMessage: \"Modal Content\",\n            })}\n          </Field.Label>\n          <Textarea\n            value={content}\n            onChange={(e: React.ChangeEvent<HTMLTextAreaElement>) =>\n              onContentChange(e.target.value)\n            }\n            rows={4}\n          />\n        </Field.Root>\n      </Box>\n    </>\n  );\n};","import React from \"react\";\nimport { useIntl } from \"react-intl\";\nimport { Box, TextInput, Field } from \"@strapi/design-system\";\n\ninterface TooltipActionFieldsProps {\n  text: string;\n  onChange: (text: string) => void;\n}\n\nexport const TooltipActionFields: React.FC<TooltipActionFieldsProps> = ({\n  text,\n  onChange,\n}) => {\n  const { formatMessage } = useIntl();\n\n  return (\n    <Box marginBottom={3}>\n      <Field.Root>\n        <Field.Label>\n          {formatMessage({\n            id: \"image-hotspot.action-tooltip-text\",\n            defaultMessage: \"Tooltip Text\",\n          })}\n        </Field.Label>\n        <TextInput\n          value={text}\n          onChange={(e: React.ChangeEvent<HTMLInputElement>) =>\n            onChange(e.target.value)\n          }\n        />\n      </Field.Root>\n    </Box>\n  );\n};\n","import React from \"react\";\nimport { useIntl } from \"react-intl\";\nimport { Box, TextInput, Textarea, Field } from \"@strapi/design-system\";\n\ninterface CallbackActionFieldsProps {\n  name: string;\n  params: string;\n  onNameChange: (name: string) => void;\n  onParamsChange: (params: string) => void;\n}\n\nexport const CallbackActionFields: React.FC<CallbackActionFieldsProps> = ({\n  name,\n  params,\n  onNameChange,\n  onParamsChange,\n}) => {\n  const { formatMessage } = useIntl();\n\n  return (\n    <>\n      <Box marginBottom={3}>\n        <Field.Root>\n          <Field.Label>\n            {formatMessage({\n              id: \"image-hotspot.action-callback-name\",\n              defaultMessage: \"Function Name\",\n            })}\n          </Field.Label>\n          <TextInput\n            value={name}\n            onChange={(e: React.ChangeEvent<HTMLInputElement>) =>\n              onNameChange(e.target.value)\n            }\n            placeholder=\"handleHotspotClick\"\n          />\n        </Field.Root>\n      </Box>\n      <Box marginBottom={3}>\n        <Field.Root>\n          <Field.Label>\n            {formatMessage({\n              id: \"image-hotspot.action-callback-params\",\n              defaultMessage: \"Parameters (JSON)\",\n            })}\n          </Field.Label>\n          <Textarea\n            value={params}\n            onChange={(e: React.ChangeEvent<HTMLTextAreaElement>) =>\n              onParamsChange(e.target.value)\n            }\n            rows={4}\n            placeholder='{\"key\": \"value\"}'\n          />\n        </Field.Root>\n      </Box>\n    </>\n  );\n};","import React from \"react\";\nimport { useIntl } from \"react-intl\";\nimport { Box, TextInput, Textarea, Field } from \"@strapi/design-system\";\n\ninterface CustomActionFieldsProps {\n  name: string;\n  payload: string;\n  onNameChange: (name: string) => void;\n  onPayloadChange: (payload: string) => void;\n}\n\nexport const CustomActionFields: React.FC<CustomActionFieldsProps> = ({\n  name,\n  payload,\n  onNameChange,\n  onPayloadChange,\n}) => {\n  const { formatMessage } = useIntl();\n\n  return (\n    <>\n      <Box marginBottom={3}>\n        <Field.Root>\n          <Field.Label>\n            {formatMessage({\n              id: \"image-hotspot.action-custom-name\",\n              defaultMessage: \"Name\",\n            })}\n          </Field.Label>\n          <TextInput\n            value={name}\n            onChange={(e: React.ChangeEvent<HTMLInputElement>) =>\n              onNameChange(e.target.value)\n            }\n            placeholder=\"Custom Name\"\n          />\n        </Field.Root>\n      </Box>\n      <Box marginBottom={3}>\n        <Field.Root>\n          <Field.Label>\n            {formatMessage({\n              id: \"image-hotspot.action-custom-payload\",\n              defaultMessage: \"Payload (JSON)\",\n            })}\n          </Field.Label>\n          <Textarea\n            value={payload}\n            onChange={(e: React.ChangeEvent<HTMLTextAreaElement>) =>\n              onPayloadChange(e.target.value)\n            }\n            rows={6}\n            placeholder='{\"key\": \"value\"}'\n          />\n        </Field.Root>\n      </Box>\n    </>\n  );\n};\n","import React from \"react\";\nimport { useIntl } from \"react-intl\";\nimport { Box, Button, Flex, Typography } from \"@strapi/design-system\";\nimport type { HotspotAction } from \"../types\";\nimport { useActionForm } from \"../hooks\";\nimport { ActionTypeSelector } from \"./ActionTypeSelector\";\nimport { LinkActionFields } from \"./LinkActionFields\";\nimport { ModalActionFields } from \"./ModalActionFields\";\nimport { TooltipActionFields } from \"./TooltipActionFields\";\nimport { CallbackActionFields } from \"./CallbackActionFields\";\nimport { CustomActionFields } from \"./CustomActionFields\";\n\ninterface ActionEditorProps {\n  action: HotspotAction | undefined;\n  onActionChange: (action: HotspotAction | undefined) => void;\n  onClose: () => void;\n}\n\nexport const ActionEditor: React.FC<ActionEditorProps> = ({\n  action,\n  onActionChange,\n  onClose,\n}) => {\n  const { formatMessage } = useIntl();\n  const { actionType, formState, updateActionType, updateField, buildAction } =\n    useActionForm(action);\n\n  const handleSave = () => {\n    const newAction = buildAction();\n    onActionChange(newAction);\n    onClose();\n  };\n\n  const actionFieldsMap = {\n    link: (\n      <LinkActionFields\n        url={formState.url}\n        target={formState.target}\n        onUrlChange={(url) => updateField(\"url\", url)}\n        onTargetChange={(target) => updateField(\"target\", target)}\n      />\n    ),\n    modal: (\n      <ModalActionFields\n        title={formState.modalTitle}\n        content={formState.modalContent}\n        onTitleChange={(title) => updateField(\"modalTitle\", title)}\n        onContentChange={(content) => updateField(\"modalContent\", content)}\n      />\n    ),\n    tooltip: (\n      <TooltipActionFields\n        text={formState.tooltipText}\n        onChange={(text) => updateField(\"tooltipText\", text)}\n      />\n    ),\n    callback: (\n      <CallbackActionFields\n        name={formState.callbackName}\n        params={formState.callbackParams}\n        onNameChange={(name) => updateField(\"callbackName\", name)}\n        onParamsChange={(params) => updateField(\"callbackParams\", params)}\n      />\n    ),\n    custom: (\n      <CustomActionFields\n        name={formState.customName}\n        payload={formState.customPayload}\n        onNameChange={(name) => updateField(\"customName\", name)}\n        onPayloadChange={(payload) => updateField(\"customPayload\", payload)}\n      />\n    ),\n    none: null,\n  };\n\n  const renderActionFields = () => {\n    return actionFieldsMap[actionType] ?? null;\n  };\n\n  return (\n    <Box\n      padding={4}\n      background=\"neutral0\"\n      borderRadius=\"4px\"\n      borderColor=\"neutral200\"\n      borderStyle=\"solid\"\n      borderWidth=\"1px\"\n      marginTop={2}\n    >\n      <Typography variant=\"pi\" fontWeight=\"semiBold\" marginBottom={3}>\n        {formatMessage({\n          id: \"image-hotspot.action-editor-title\",\n          defaultMessage: \"Configure Action\",\n        })}\n      </Typography>\n\n      <ActionTypeSelector value={actionType} onChange={updateActionType} />\n\n      {renderActionFields()}\n\n      <Flex gap={2} justifyContent=\"flex-end\">\n        <Button variant=\"tertiary\" onClick={onClose}>\n          {formatMessage({\n            id: \"image-hotspot.cancel\",\n            defaultMessage: \"Cancel\",\n          })}\n        </Button>\n        <Button onClick={handleSave}>\n          {formatMessage({\n            id: \"image-hotspot.save\",\n            defaultMessage: \"Save\",\n          })}\n        </Button>\n      </Flex>\n    </Box>\n  );\n};\n","import React, { useState } from \"react\";\nimport { useIntl } from \"react-intl\";\nimport { Box, Button, Flex, Typography } from \"@strapi/design-system\";\nimport { Trash, Cog } from \"@strapi/icons\";\nimport styled from \"styled-components\";\nimport type { Hotspot, HotspotAction } from \"../types\";\nimport { ActionEditor } from \"./ActionEditor\";\n\nconst formatActionLabel = (action: HotspotAction): string => {\n  switch (action.type) {\n    case \"link\":\n      return action.url ? `Link (${action.url})` : \"Link\";\n    case \"modal\":\n      return `Modal (${action.modalTitle || \"Untitled\"})`;\n    case \"tooltip\":\n      return `Tooltip (${action.tooltipText || \"\"})`;\n    case \"callback\":\n      return `Callback (${action.callbackName || \"\"})`;\n    default:\n      return action.type;\n  }\n};\n\ninterface HotspotListProps {\n  hotspots: Hotspot[];\n  onDelete: (id: string) => void;\n  onActionUpdate: (id: string, action: HotspotAction | undefined) => void;\n}\n\nconst StyledList = styled.ul`\n  padding: 0;\n  margin: 0;\n  list-style: none;\n`;\n\nconst StyledListItem = styled.li`\n  padding: ${({ theme }) => theme.spaces[2]};\n  background: ${({ theme }) => theme.colors.neutral0};\n  border-radius: 4px;\n  border: 1px solid ${({ theme }) => theme.colors.neutral200};\n  margin-bottom: 8px;\n`;\n\nexport const HotspotList: React.FC<HotspotListProps> = ({\n  hotspots,\n  onDelete,\n  onActionUpdate,\n}) => {\n  const { formatMessage } = useIntl();\n  const [editingActionId, setEditingActionId] = useState<string | null>(null);\n\n  if (hotspots.length === 0) {\n    return null;\n  }\n\n  return (\n    <Box marginTop={4}>\n      <Box marginBottom={2}>\n        <Typography variant=\"pi\" fontWeight=\"bold\">\n          {formatMessage({\n            id: \"image-hotspot.hotspots-list\",\n            defaultMessage: \"Hotspots\",\n          })}{\" \"}\n          ({hotspots.length})\n        </Typography>\n      </Box>\n      <StyledList>\n        {hotspots.map((hotspot, index) => (\n          <StyledListItem key={hotspot.id}>\n            <Flex justifyContent=\"space-between\" alignItems=\"center\">\n              <Box>\n                <Typography variant=\"pi\">\n                  {index + 1} - {hotspot.type}{\" \"}\n                  {hotspot.type === \"point\" ? (\n                    <>\n                      X: {hotspot.x.toFixed(1)}%, Y: {hotspot.y.toFixed(1)}%\n                    </>\n                  ) : (\n                    <>\n                      X: {hotspot.x.toFixed(1)}%, Y: {hotspot.y.toFixed(1)}%, W:{\" \"}\n                      {hotspot.width?.toFixed(1)}%, H:{\" \"}\n                      {hotspot.height?.toFixed(1)}%\n                    </>\n                  )}\n                </Typography>\n                {hotspot.action && hotspot.action.type !== \"none\" && (\n                  <Typography variant=\"pi\" textColor=\"neutral600\" fontSize={1}>\n                    {formatMessage({\n                      id: \"image-hotspot.action-label\",\n                      defaultMessage: \"Action:\",\n                    })}{\" \"}\n                    {formatActionLabel(hotspot.action)}\n                  </Typography>\n                )}\n              </Box>\n              <Flex gap={2}>\n                <Button\n                  variant=\"tertiary\"\n                  size=\"S\"\n                  onClick={() =>\n                    setEditingActionId(\n                      editingActionId === hotspot.id ? null : hotspot.id,\n                    )\n                  }\n                  startIcon={<Cog />}\n                >\n                  {formatMessage({\n                    id: \"image-hotspot.configure-action\",\n                    defaultMessage: \"Action\",\n                  })}\n                </Button>\n                <Button\n                  variant=\"tertiary\"\n                  size=\"S\"\n                  onClick={() => onDelete(hotspot.id)}\n                  startIcon={<Trash />}\n                >\n                  {formatMessage({\n                    id: \"image-hotspot.delete\",\n                    defaultMessage: \"Delete\",\n                  })}\n                </Button>\n              </Flex>\n            </Flex>\n            {editingActionId === hotspot.id && (\n              <ActionEditor\n                action={hotspot.action}\n                onActionChange={(action) => {\n                  onActionUpdate(hotspot.id, action);\n                  setEditingActionId(null);\n                }}\n                onClose={() => setEditingActionId(null)}\n              />\n            )}\n          </StyledListItem>\n        ))}\n      </StyledList>\n    </Box>\n  );\n};\n","import React, { useState, useCallback, useRef } from \"react\";\nimport { useIntl } from \"react-intl\";\nimport { Box, Typography, Field } from \"@strapi/design-system\";\nimport type { HotspotType, Image, ImageHotspotProps } from \"../types\";\nimport { useStrapiApp } from \"@strapi/strapi/admin\";\nimport { ImageSelector } from \"./ImageSelector\";\nimport { HotspotEditor } from \"./HotspotEditor\";\nimport { HotspotList } from \"./HotspotList\";\nimport {\n  useHotspotState,\n  useRectangleDrawing,\n  useHotspotOperations,\n} from \"../hooks\";\nimport { getPercentageCoordinates, isMarkerElement } from \"../utils\";\n\nconst ImageHotspot: React.FC<ImageHotspotProps> = ({\n  name,\n  value,\n  onChange,\n  attribute,\n  error,\n}) => {\n  const MediaLibrary = useStrapiApp(\n    \"media-library\",\n    (state: any) => state.components[\"media-library\"],\n  );\n  const imageRef = useRef<HTMLImageElement>(null);\n  const [selectionMode, setSelectionMode] = useState<HotspotType>(\"point\");\n  const [isMediaLibraryOpen, setIsMediaLibraryOpen] = useState(false);\n  // Manage hotspot and image state\n  const { hotspots, setHotspots, imageData, setImageData, handleImageRemove } =\n    useHotspotState(value, name, onChange);\n\n  // Manage rectangle drawing\n  const { isDrawingRectangle, currentRectangle, startRectangleDrawing } =\n    useRectangleDrawing(imageRef, hotspots, setHotspots);\n\n  // Manage hotspot operations\n  const {\n    handleHotspotDelete,\n    handleHotspotDrag,\n    handleRectangleResize,\n    handleActionUpdate,\n    handleCreatePoint,\n  } = useHotspotOperations(hotspots, setHotspots);\n\n  const handleSelectAssets = useCallback(\n    (assets: Image[]) => {\n      if (assets && assets.length > 0) {\n        const asset = assets[0];\n        setImageData(asset);\n      }\n      setIsMediaLibraryOpen(false);\n    },\n    [setImageData],\n  );\n\n  const handleCloseMediaLibrary = useCallback(() => {\n    setIsMediaLibraryOpen(false);\n  }, []);\n\n  const handleImageMouseDown = useCallback(\n    (event: React.MouseEvent<HTMLImageElement>) => {\n      if (!imageRef.current) return;\n\n      // Check if the click target is actually the image, not a marker\n      const target = event.target as HTMLElement;\n      if (target !== imageRef.current && isMarkerElement(target)) {\n        return; // Click was on a marker, not the image\n      }\n\n      event.preventDefault();\n      event.stopPropagation();\n\n      const coords = getPercentageCoordinates(\n        event.clientX,\n        event.clientY,\n        imageRef.current,\n      );\n\n      if (selectionMode === \"point\") {\n        handleCreatePoint(coords.x, coords.y);\n      } else if (selectionMode === \"rectangle\") {\n        startRectangleDrawing(coords.x, coords.y);\n      }\n    },\n    [selectionMode, handleCreatePoint, startRectangleDrawing],\n  );\n\n  const imageUrl = imageData?.url;\n\n  return (\n    <Box>\n      <Field.Label marginBottom={1}>{name}</Field.Label>\n      <Box\n        borderWidth=\"1px\"\n        borderStyle=\"solid\"\n        borderColor=\"neutral200\"\n        borderRadius=\"4px\"\n        padding={4}\n      >\n        <ImageSelector\n          imageData={imageData || null}\n          onSelectImage={() => setIsMediaLibraryOpen(true)}\n          onRemoveImage={handleImageRemove}\n          isMediaLibraryOpen={isMediaLibraryOpen}\n          MediaLibrary={MediaLibrary}\n          onCloseMediaLibrary={handleCloseMediaLibrary}\n          onSelectAssets={handleSelectAssets}\n        />\n\n        {imageData && (\n          <>\n            <HotspotEditor\n              imageUrl={imageUrl || \"\"}\n              imageData={imageData}\n              hotspots={hotspots}\n              selectionMode={selectionMode}\n              isDrawingRectangle={isDrawingRectangle}\n              currentRectangle={currentRectangle}\n              error={error}\n              imageRef={imageRef}\n              onImageMouseDown={handleImageMouseDown}\n              onHotspotDrag={handleHotspotDrag}\n              onRectangleResize={handleRectangleResize}\n              onSelectionModeChange={setSelectionMode}\n            />\n            <HotspotList\n              hotspots={hotspots}\n              onDelete={handleHotspotDelete}\n              onActionUpdate={handleActionUpdate}\n            />\n          </>\n        )}\n\n        {error && (\n          <Typography variant=\"pi\" textColor=\"danger600\" marginTop={2}>\n            {error}\n          </Typography>\n        )}\n      </Box>\n    </Box>\n  );\n};\n\nexport default ImageHotspot;\n"],"names":["MarkerContainer"],"mappings":"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"}