{"version":3,"file":"SharedStateContext.cjs","sources":["../../src/react/useOptimistic.ts","../../../../node_modules/.pnpm/uuid@11.1.0/node_modules/uuid/dist/esm-browser/stringify.js","../../../../node_modules/.pnpm/uuid@11.1.0/node_modules/uuid/dist/esm-browser/rng.js","../../../../node_modules/.pnpm/uuid@11.1.0/node_modules/uuid/dist/esm-browser/native.js","../../../../node_modules/.pnpm/uuid@11.1.0/node_modules/uuid/dist/esm-browser/v4.js","../../src/util/geometry.ts","../../src/util/dragAndDrop.ts","../../src/util/elements.ts","../../src/util/stega.ts","../../src/util/findSanityNodes.ts","../../src/controller.ts","../../src/ui/shared-state/SharedStateContext.ts"],"sourcesContent":["import {getPublishedId} from '@sanity/client/csm'\nimport type {SanityDocument} from '@sanity/types'\nimport {startTransition, useEffect, useState} from 'react'\nimport {useEffectEvent} from 'use-effect-event'\nimport {isEmptyActor} from '../optimistic/context'\nimport type {OptimisticReducer, OptimisticReducerAction} from '../optimistic/types'\nimport {useOptimisticActor} from './useOptimisticActor'\n\nexport function useOptimistic<T, U = SanityDocument>(\n  passthrough: T,\n  reducer: OptimisticReducer<T, U> | Array<OptimisticReducer<T, U>>,\n): T {\n  const [pristine, setPristine] = useState(true)\n  const [optimistic, setOptimistic] = useState<T>(passthrough)\n  const [lastEvent, setLastEvent] = useState<OptimisticReducerAction<U> | null>(null)\n  const [lastPassthrough, setLastPassthrough] = useState<T>(passthrough)\n\n  const actor = useOptimisticActor()\n\n  /**\n   * This action is used in two `useEffect` hooks, it needs access to the provided `reducer`,\n   * but doesn't want to cause re-renders if `reducer` changes identity.\n   * The `useEffectEvent` hook ensures that the `reducer` value is never stale when used, and doesn't trigger setup and teardown of\n   * `useEffect` deps to make it happen.\n   */\n  const reduceStateFromAction = useEffectEvent(\n    (action: OptimisticReducerAction<U>, prevState: T) => {\n      const reducers = Array.isArray(reducer) ? reducer : [reducer]\n      return reducers.reduce(\n        (acc, reducer) =>\n          reducer(acc, {\n            document: action.document,\n            id: getPublishedId(action.id),\n            originalId: action.id,\n            type: action.type,\n          }),\n        prevState,\n      )\n    },\n  )\n\n  /**\n   * Records the last passthrough value when reducers ran in response to a rebased event.\n   * This allows us to later know when reducers should run should the passthrough change.\n   */\n  const updateLastPassthrough = useEffectEvent(() => setLastPassthrough(passthrough))\n\n  /**\n   * Handle rebase events, which runs the provided reducers,\n   * caches the event that was used to produce the new state,\n   * and marks the state as non-pristine.\n   */\n  useEffect(() => {\n    // If the actor hasn't been set yet, we don't need to subscribe to mutations\n    if (isEmptyActor(actor)) {\n      return\n    }\n\n    /**\n     * The pristine event fires much too soon, so the temporary workaround is that we greatly delay firing `setPristine(true)`,\n     * and instead relying on re-running reducers with the last event whenever the passthrough changes, to preserve the optimistic state,\n     * until we hopefully have eventual consistency on the passthrough.\n     */\n    let pristineTimeout: ReturnType<typeof setTimeout>\n\n    const rebasedSub = actor.on('rebased.local', (_event) => {\n      const event = {\n        // @todo You shall not cast\n        document: _event.document as U,\n        id: _event.id,\n        originalId: getPublishedId(_event.id),\n        // @todo This should eventually be emitted by the state machine\n        type: 'mutate' as const,\n      }\n      setOptimistic((prevState) => reduceStateFromAction(event, prevState))\n      setLastEvent(event)\n      updateLastPassthrough()\n      setPristine(false)\n\n      clearTimeout(pristineTimeout)\n    })\n    const pristineSub = actor.on('pristine', () => {\n      pristineTimeout = setTimeout(() => {\n        // Marking it in a startTransition allows react to interrupt the resulting render, should a new rebase happen and we're back to dirty\n        startTransition(() => setPristine(true))\n      }, 15000)\n    })\n    return () => {\n      rebasedSub.unsubscribe()\n      pristineSub.unsubscribe()\n    }\n  }, [actor])\n\n  /**\n   * If the passthrough changes, and we are in a dirty state, we rerun the reducers with the new passthrough but the previous event.\n   * Marking it in a transition allows react to interrupt this render should a new action happen, or should we be back in a pristine state.\n   */\n  useEffect(() => {\n    if (pristine) {\n      // if we are pristine, then we will passthrough anyway\n      return undefined\n    }\n    if (!lastEvent) {\n      // If we don't have a lastEvent when we are pristine, it's a fatal error\n      throw new Error('No last event found when syncing passthrough')\n    }\n    if (lastPassthrough === passthrough) {\n      // If the passthrough hasn't changed, then we don't need to rerun the reducers\n      return undefined\n    }\n\n    // Marking it in a startTransition allows react to interrupt the resulting render, should a new rebase happen\n    startTransition(() => {\n      setOptimistic(reduceStateFromAction(lastEvent, passthrough))\n      setLastPassthrough(passthrough)\n    })\n  }, [lastEvent, lastPassthrough, passthrough, pristine])\n\n  return pristine ? passthrough : optimistic\n}\n","import validate from './validate.js';\nconst byteToHex = [];\nfor (let i = 0; i < 256; ++i) {\n    byteToHex.push((i + 0x100).toString(16).slice(1));\n}\nexport function unsafeStringify(arr, offset = 0) {\n    return (byteToHex[arr[offset + 0]] +\n        byteToHex[arr[offset + 1]] +\n        byteToHex[arr[offset + 2]] +\n        byteToHex[arr[offset + 3]] +\n        '-' +\n        byteToHex[arr[offset + 4]] +\n        byteToHex[arr[offset + 5]] +\n        '-' +\n        byteToHex[arr[offset + 6]] +\n        byteToHex[arr[offset + 7]] +\n        '-' +\n        byteToHex[arr[offset + 8]] +\n        byteToHex[arr[offset + 9]] +\n        '-' +\n        byteToHex[arr[offset + 10]] +\n        byteToHex[arr[offset + 11]] +\n        byteToHex[arr[offset + 12]] +\n        byteToHex[arr[offset + 13]] +\n        byteToHex[arr[offset + 14]] +\n        byteToHex[arr[offset + 15]]).toLowerCase();\n}\nfunction stringify(arr, offset = 0) {\n    const uuid = unsafeStringify(arr, offset);\n    if (!validate(uuid)) {\n        throw TypeError('Stringified UUID is invalid');\n    }\n    return uuid;\n}\nexport default stringify;\n","let getRandomValues;\nconst rnds8 = new Uint8Array(16);\nexport default function rng() {\n    if (!getRandomValues) {\n        if (typeof crypto === 'undefined' || !crypto.getRandomValues) {\n            throw new Error('crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported');\n        }\n        getRandomValues = crypto.getRandomValues.bind(crypto);\n    }\n    return getRandomValues(rnds8);\n}\n","const randomUUID = typeof crypto !== 'undefined' && crypto.randomUUID && crypto.randomUUID.bind(crypto);\nexport default { randomUUID };\n","import native from './native.js';\nimport rng from './rng.js';\nimport { unsafeStringify } from './stringify.js';\nfunction v4(options, buf, offset) {\n    if (native.randomUUID && !buf && !options) {\n        return native.randomUUID();\n    }\n    options = options || {};\n    const rnds = options.random ?? options.rng?.() ?? rng();\n    if (rnds.length < 16) {\n        throw new Error('Random bytes length must be >= 16');\n    }\n    rnds[6] = (rnds[6] & 0x0f) | 0x40;\n    rnds[8] = (rnds[8] & 0x3f) | 0x80;\n    if (buf) {\n        offset = offset || 0;\n        if (offset < 0 || offset + 16 > buf.length) {\n            throw new RangeError(`UUID byte range ${offset}:${offset + 15} is out of buffer bounds`);\n        }\n        for (let i = 0; i < 16; ++i) {\n            buf[offset + i] = rnds[i];\n        }\n        return buf;\n    }\n    return unsafeStringify(rnds);\n}\nexport default v4;\n","import type {OverlayRect, Point2D, Ray2D} from '../types'\n\nexport function getRect(element: Element): OverlayRect {\n  const domRect = element.getBoundingClientRect()\n\n  const rect = {\n    x: domRect.x + scrollX,\n    y: domRect.y + scrollY,\n    w: domRect.width,\n    h: domRect.height,\n  }\n\n  return rect\n}\n\nexport function offsetRect(rect: OverlayRect, px: number, axis: 'x' | 'y'): OverlayRect {\n  if (axis === 'x') {\n    return {\n      x: rect.x + px,\n      y: rect.y,\n      w: rect.w - 2 * px,\n      h: rect.h,\n    }\n  } else {\n    return {\n      x: rect.x,\n      y: rect.y + px,\n      w: rect.w,\n      h: rect.h - 2 * px,\n    }\n  }\n}\n\n// Ref http://paulbourke.net/geometry/pointlineplane/\nexport function rayIntersect(l1: Ray2D, l2: Ray2D): Point2D | false {\n  const {x1, y1, x2, y2} = l1\n  const {x1: x3, y1: y3, x2: x4, y2: y4} = l2\n\n  // Check if none of the lines are of length 0\n  if ((x1 === x2 && y1 === y2) || (x3 === x4 && y3 === y4)) {\n    return false\n  }\n\n  const denominator = (y4 - y3) * (x2 - x1) - (x4 - x3) * (y2 - y1)\n\n  // Lines are parallel\n  if (denominator === 0) {\n    return false\n  }\n\n  const ua = ((x4 - x3) * (y1 - y3) - (y4 - y3) * (x1 - x3)) / denominator\n  const ub = ((x2 - x1) * (y1 - y3) - (y2 - y1) * (x1 - x3)) / denominator\n\n  // is the intersection along the segments\n  if (ua < 0 || ua > 1 || ub < 0 || ub > 1) {\n    return false\n  }\n\n  const x = x1 + ua * (x2 - x1)\n  const y = y1 + ua * (y2 - y1)\n\n  return {x, y}\n}\n\nexport function rectEqual(r1: OverlayRect, r2: OverlayRect): boolean {\n  return r1.x === r2.x && r1.y === r2.y && r1.w === r2.w && r1.h === r2.h\n}\n\nexport function rayRectIntersections(line: Ray2D, rect: OverlayRect): Array<Point2D> | false {\n  const rectLines: Array<Ray2D> = [\n    {x1: rect.x, y1: rect.y, x2: rect.x + rect.w, y2: rect.y},\n    {\n      x1: rect.x + rect.w,\n      y1: rect.y,\n      x2: rect.x + rect.w,\n      y2: rect.y + rect.h,\n    },\n    {\n      x1: rect.x + rect.w,\n      y1: rect.y + rect.h,\n      x2: rect.x,\n      y2: rect.y + rect.h,\n    },\n    {\n      x1: rect.x,\n      y1: rect.y + rect.h,\n      x2: rect.x,\n      y2: rect.y,\n    },\n  ]\n\n  const intersections: Array<Point2D> = []\n\n  for (let i = 0; i < rectLines.length; i++) {\n    const intersection = rayIntersect(line, rectLines[i])\n\n    if (intersection) {\n      let isDuplicate = false\n\n      for (let j = 0; j < intersections.length; j++) {\n        if (intersections[j].x === intersection.x && intersections[j].y === intersection.y) {\n          isDuplicate = true\n        }\n      }\n\n      if (!isDuplicate) intersections.push(intersection)\n    }\n  }\n\n  if (intersections.length === 0) {\n    return false\n  }\n\n  return intersections.sort(\n    (a, b) => pointDist(a, {x: line.x1, y: line.y1}) - pointDist(b, {x: line.x1, y: line.y1}),\n  )\n}\nexport function pointDist(p1: Point2D, p2: Point2D): number {\n  const a = p1.x - p2.x\n  const b = p1.y - p2.y\n\n  return Math.sqrt(a * a + b * b)\n}\n\nexport function pointInBounds(point: Point2D, bounds: OverlayRect): boolean {\n  const withinX = point.x >= bounds.x && point.x <= bounds.x + bounds.w\n  const withinY = point.y >= bounds.y && point.y <= bounds.y + bounds.h\n\n  return withinX && withinY\n}\n\nexport function findClosestIntersection(\n  ray: Ray2D,\n  targets: OverlayRect[],\n  flow: string,\n): OverlayRect | null {\n  const rayOrigin = {\n    x: ray.x1,\n    y: ray.y1,\n  }\n\n  // Offset rects to ensure raycasting works when siblings touch\n  if (\n    targets.some((t) =>\n      pointInBounds(\n        rayOrigin,\n        offsetRect(t, Math.min(t.w, t.h) / 10, flow === 'horizontal' ? 'x' : 'y'),\n      ),\n    )\n  )\n    return null\n  let closestIntersection\n  let closestRect\n\n  for (const target of targets) {\n    const intersections = rayRectIntersections(\n      ray,\n      offsetRect(target, Math.min(target.w, target.h) / 10, flow === 'horizontal' ? 'x' : 'y'),\n    )\n    if (intersections) {\n      const firstIntersection = intersections[0]\n\n      if (closestIntersection) {\n        if (pointDist(rayOrigin, firstIntersection) < pointDist(rayOrigin, closestIntersection)) {\n          closestIntersection = firstIntersection\n          closestRect = target\n        }\n      } else {\n        closestIntersection = firstIntersection\n        closestRect = target\n      }\n    }\n  }\n\n  if (closestRect) return closestRect\n\n  return null\n}\n\nexport function scaleRect(\n  rect: OverlayRect,\n  scale: number,\n  origin: {x: number; y: number},\n): OverlayRect {\n  const {x, y, w, h} = rect\n  const {x: originX, y: originY} = origin\n\n  const newX = originX + (x - originX) * scale\n  const newY = originY + (y - originY) * scale\n\n  const newWidth = w * scale\n  const newHeight = h * scale\n\n  return {\n    x: newX,\n    y: newY,\n    w: newWidth,\n    h: newHeight,\n  }\n}\n\nexport function getRectGroupXExtent(rects: OverlayRect[]): {\n  min: number\n  max: number\n  width: number\n} {\n  const minGroupX = Math.max(0, Math.min(...rects.map((r) => r.x)))\n  const maxGroupX = Math.min(document.body.offsetWidth, Math.max(...rects.map((r) => r.x + r.w)))\n\n  return {\n    min: minGroupX,\n    max: maxGroupX,\n    width: maxGroupX - minGroupX,\n  }\n}\n\nexport function getRectGroupYExtent(rects: OverlayRect[]): {\n  min: number\n  max: number\n  height: number\n} {\n  const minGroupY = Math.max(0, Math.min(...rects.map((r) => r.y)))\n  const maxGroupY = Math.min(document.body.scrollHeight, Math.max(...rects.map((r) => r.y + r.h)))\n\n  return {\n    min: minGroupY,\n    max: maxGroupY,\n    height: maxGroupY - minGroupY,\n  }\n}\n","import type {\n  DragInsertPosition,\n  DragInsertPositionRects,\n  ElementNode,\n  OverlayElement,\n  OverlayEventHandler,\n  OverlayRect,\n  Point2D,\n  SanityNode,\n} from '../types'\nimport {\n  findClosestIntersection,\n  getRect,\n  getRectGroupXExtent,\n  getRectGroupYExtent,\n  pointDist,\n  rectEqual,\n  scaleRect,\n} from './geometry'\n\nfunction calcTargetFlow(targets: OverlayRect[]) {\n  if (\n    targets.some((t1) => {\n      const others = targets.filter((t2) => !rectEqual(t1, t2))\n\n      return others.some((t2) => {\n        return t1.y === t2.y\n      })\n    })\n  ) {\n    return 'horizontal'\n  } else {\n    return 'vertical'\n  }\n}\n\nfunction calcInsertPosition(origin: Point2D, targets: OverlayRect[], flow: string) {\n  if (flow === 'horizontal') {\n    const rayLeft = {\n      x1: origin.x,\n      y1: origin.y,\n      x2: origin.x - 100_000_000,\n      y2: origin.y,\n    }\n\n    const rayRight = {\n      x1: origin.x,\n      y1: origin.y,\n      x2: origin.x + 100_000_000,\n      y2: origin.y,\n    }\n\n    return {\n      left: findClosestIntersection(rayLeft, targets, flow),\n      right: findClosestIntersection(rayRight, targets, flow),\n    }\n  } else {\n    const rayTop = {\n      x1: origin.x,\n      y1: origin.y,\n      x2: origin.x,\n      y2: origin.y - 100_000_000,\n    }\n\n    const rayBottom = {\n      x1: origin.x,\n      y1: origin.y,\n      x2: origin.x,\n      y2: origin.y + 100_000_000,\n    }\n\n    return {\n      top: findClosestIntersection(rayTop, targets, flow),\n      bottom: findClosestIntersection(rayBottom, targets, flow),\n    }\n  }\n}\n\nfunction findRectSanityData(rect: OverlayRect, overlayGroup: OverlayElement[]) {\n  return overlayGroup.find((e) => rectEqual(getRect(e.elements.element), rect))\n    ?.sanity as SanityNode\n}\n\nfunction resolveInsertPosition(\n  overlayGroup: OverlayElement[],\n  insertPosition: DragInsertPositionRects,\n  flow: string,\n): DragInsertPosition {\n  if (Object.values(insertPosition).every((v) => v === null)) return null\n\n  if (flow === 'horizontal') {\n    return {\n      left: insertPosition.left\n        ? {\n            rect: insertPosition.left,\n            sanity: findRectSanityData(insertPosition.left, overlayGroup),\n          }\n        : null,\n      right: insertPosition.right\n        ? {\n            rect: insertPosition.right,\n            sanity: findRectSanityData(insertPosition.right, overlayGroup),\n          }\n        : null,\n    }\n  } else {\n    return {\n      top: insertPosition.top\n        ? {\n            rect: insertPosition.top,\n            sanity: findRectSanityData(insertPosition.top, overlayGroup),\n          }\n        : null,\n      bottom: insertPosition.bottom\n        ? {\n            rect: insertPosition.bottom,\n            sanity: findRectSanityData(insertPosition.bottom, overlayGroup),\n          }\n        : null,\n    }\n  }\n}\n\nfunction calcMousePos(e: MouseEvent) {\n  const bodyBounds = document.body.getBoundingClientRect()\n\n  return {\n    x: Math.max(bodyBounds.x, Math.min(e.clientX, bodyBounds.x + bodyBounds.width)),\n    y: e.clientY + window.scrollY,\n  }\n}\n\nfunction calcMousePosInverseTransform(mousePos: Point2D) {\n  const body = document.body\n  const computedStyle = window.getComputedStyle(body)\n  const transform = computedStyle.transform\n\n  if (transform === 'none') {\n    return {\n      x: mousePos.x,\n      y: mousePos.y,\n    }\n  }\n\n  const matrix = new DOMMatrix(transform)\n  const inverseMatrix = matrix.inverse()\n\n  const point = new DOMPoint(mousePos.x, mousePos.y)\n  const transformedPoint = point.matrixTransform(inverseMatrix)\n\n  return {\n    x: transformedPoint.x,\n    y: transformedPoint.y,\n  }\n}\n\nfunction buildPreviewSkeleton(mousePos: Point2D, element: ElementNode, scaleFactor: number) {\n  const bounds = getRect(element)\n\n  const children = [\n    ...element.querySelectorAll(':where(h1, h2, h3, h4, p, a, img, span, button):not(:has(*))'),\n  ]\n\n  if (mousePos.x <= bounds.x) mousePos.x = bounds.x\n  if (mousePos.x >= bounds.x + bounds.w) mousePos.x = bounds.x + bounds.w\n\n  if (mousePos.y >= bounds.y + bounds.h) mousePos.y = bounds.y + bounds.h\n  if (mousePos.y <= bounds.y) mousePos.y = bounds.y\n\n  const childRects = children.map((child: Element) => {\n    // offset to account for stroke in rendered rects\n    const rect = scaleRect(getRect(child), scaleFactor, {\n      x: bounds.x,\n      y: bounds.y,\n    })\n\n    return {\n      x: rect.x - bounds.x,\n      y: rect.y - bounds.y,\n      w: rect.w,\n      h: rect.h,\n      tagName: child.tagName,\n    }\n  })\n\n  return {\n    offsetX: (bounds.x - mousePos.x) * scaleFactor,\n    offsetY: (bounds.y - mousePos.y) * scaleFactor,\n    w: bounds.w * scaleFactor,\n    h: bounds.h * scaleFactor,\n    maxWidth: bounds.w * scaleFactor * 0.75,\n    childRects,\n  }\n}\n\nconst minDragDelta = 4\n\nasync function applyMinimapWrapperTransform(\n  target: HTMLElement,\n  scaleFactor: number,\n  minYScaled: number,\n  handler: OverlayEventHandler,\n  rectUpdateFrequency: number,\n): Promise<void> {\n  return new Promise((resolve) => {\n    target.addEventListener(\n      'transitionend',\n      () => {\n        setTimeout(() => {\n          handler({\n            type: 'overlay/dragEndMinimapTransition',\n          })\n        }, rectUpdateFrequency * 2)\n\n        resolve()\n      },\n      {once: true},\n    )\n\n    handler({\n      type: 'overlay/dragStartMinimapTransition',\n    })\n\n    handler({\n      type: 'overlay/dragToggleMinimap',\n      display: true,\n    })\n\n    document.body.style.overflow = 'hidden'\n    document.body.style.height = '100%'\n    document.documentElement.style.overflow = 'initial'\n    document.documentElement.style.height = '100%'\n\n    // ensure overflow hidden has applied and scrolling stopped before applying transform, prevent minor y-position transform issues\n    setTimeout(() => {\n      target.style.transformOrigin = '50% 0px'\n      target.style.transition = 'transform 150ms ease'\n      target.style.transform = `translate3d(0px, ${-minYScaled + scrollY}px, 0px) scale(${scaleFactor})`\n    }, 25)\n  })\n}\n\nfunction calcMinimapTransformValues(rects: OverlayRect[], groupHeightOverride: number | null) {\n  let groupHeight = groupHeightOverride || getRectGroupYExtent(rects).height\n\n  const padding = 100 // px\n\n  groupHeight += padding * 2\n\n  const scaleFactor = groupHeight > window.innerHeight ? window.innerHeight / groupHeight : 1\n  const scaledRects = rects.map((r) => scaleRect(r, scaleFactor, {x: window.innerWidth / 2, y: 0}))\n\n  const {min: minYScaled} = getRectGroupYExtent(scaledRects)\n\n  return {\n    scaleFactor,\n    minYScaled: minYScaled - padding * scaleFactor,\n  }\n}\nfunction calcGroupBoundsPreview(rects: OverlayRect[]) {\n  const groupBoundsX = getRectGroupXExtent(rects)\n  const groupBoundsY = getRectGroupYExtent(rects)\n\n  const offsetDist = 8\n\n  const canOffsetX =\n    groupBoundsX.min > offsetDist &&\n    groupBoundsX.min + groupBoundsX.width <= window.innerWidth - offsetDist\n  const canOffsetY =\n    groupBoundsY.min > offsetDist &&\n    groupBoundsY.min + groupBoundsY.height <= document.body.scrollHeight - offsetDist\n  const canOffset = canOffsetX && canOffsetY\n\n  const groupRect = {\n    x: canOffset ? groupBoundsX.min - offsetDist : groupBoundsX.min,\n    y: canOffset ? groupBoundsY.min - offsetDist : groupBoundsY.min,\n    w: canOffset ? groupBoundsX.width + offsetDist * 2 : groupBoundsX.width,\n    h: canOffset ? groupBoundsY.height + offsetDist * 2 : groupBoundsY.height,\n  }\n\n  return groupRect\n}\n\nasync function resetMinimapWrapperTransform(\n  endYOrigin: number,\n  target: HTMLElement,\n  prescaleHeight: number,\n  handler: OverlayEventHandler,\n  rectUpdateFrequency: number,\n  previousRootStyleValues: PreviousRootStyleValues | null,\n): Promise<void> {\n  return new Promise((resolve) => {\n    const computedStyle = window.getComputedStyle(target)\n    const transform = computedStyle.transform\n\n    const matrix = new DOMMatrix(transform)\n\n    const scale = matrix.a\n\n    if (scale === 1) return\n\n    const maxScroll = prescaleHeight - window.innerHeight\n    const prevScrollY = scrollY\n\n    endYOrigin -= window.innerHeight / 2\n\n    if (endYOrigin < 0) endYOrigin = 0\n\n    target.addEventListener(\n      'transitionend',\n      () => {\n        target.style.transition = `none`\n        target.style.transform = `none`\n\n        scrollTo({\n          top: endYOrigin,\n          behavior: 'instant',\n        })\n\n        setTimeout(() => {\n          handler({\n            type: 'overlay/dragEndMinimapTransition',\n          })\n\n          handler({\n            type: 'overlay/dragToggleMinimap',\n            display: false,\n          })\n        }, rectUpdateFrequency * 2)\n\n        resolve()\n      },\n      {once: true},\n    )\n\n    handler({\n      type: 'overlay/dragStartMinimapTransition',\n    })\n\n    target.style.transform = `translateY(${Math.max(prevScrollY - endYOrigin, -maxScroll + prevScrollY)}px) scale(${1})`\n\n    if (!previousRootStyleValues) return\n\n    document.body.style.overflow = previousRootStyleValues.body.overflow\n    document.body.style.height = previousRootStyleValues.body.height\n    document.documentElement.style.overflow = previousRootStyleValues.documentElement.overflow\n    document.documentElement.style.height = previousRootStyleValues.documentElement.height\n  })\n}\n\ninterface PreviousRootStyleValues {\n  body: {\n    overflow: string\n    height: string\n  }\n  documentElement: {\n    overflow: string\n    height: string\n  }\n}\n\ninterface HandleOverlayDragOpts {\n  mouseEvent: MouseEvent\n  element: ElementNode\n  overlayGroup: OverlayElement[]\n  handler: OverlayEventHandler\n  target: SanityNode\n  onSequenceStart: () => void\n  onSequenceEnd: () => void\n}\n\nlet minimapScaleApplied = false\n\nlet mousePosInverseTransform = {x: 0, y: 0}\nlet mousePos = {x: 0, y: 0}\n\nlet prescaleHeight = typeof document === 'undefined' ? 0 : document.documentElement.scrollHeight\n\nlet previousRootStyleValues: PreviousRootStyleValues | null = null\n\nexport function handleOverlayDrag(opts: HandleOverlayDragOpts): void {\n  const {mouseEvent, element, overlayGroup, handler, target, onSequenceStart, onSequenceEnd} = opts\n\n  // do not trigger drag sequence on anything other than \"main\" (0) click, ignore right click, etc\n  if (mouseEvent.button !== 0) return\n\n  // ensure keyboard events fire within frame context\n  window.focus()\n\n  const rectUpdateFrequency = 150\n  let rects = overlayGroup.map((e) => getRect(e.elements.element))\n\n  const flow = (element.getAttribute('data-sanity-drag-flow') || calcTargetFlow(rects)) as\n    | 'horizontal'\n    | 'vertical'\n\n  const dragGroup = element.getAttribute('data-sanity-drag-group')\n\n  const disableMinimap = !!element.getAttribute('data-sanity-drag-minimap-disable')\n\n  const preventInsertDefault = !!element.getAttribute('data-sanity-drag-prevent-default')\n\n  const documentHeightOverride = element.getAttribute('data-unstable_sanity-drag-document-height')\n  const groupHeightOverride = element.getAttribute('data-unstable_sanity-drag-group-height')\n\n  let insertPosition: DragInsertPositionRects | null = null\n\n  const initialMousePos = calcMousePos(mouseEvent)\n\n  const scaleTarget = document.body\n\n  const {minYScaled, scaleFactor} = calcMinimapTransformValues(\n    rects,\n    groupHeightOverride ? ~~groupHeightOverride : null,\n  )\n\n  let sequenceStarted = false\n  let minimapPromptShown = false\n\n  let mousedown = true\n\n  if (!minimapScaleApplied) {\n    previousRootStyleValues = {\n      body: {\n        overflow: window.getComputedStyle(document.body).overflow,\n        height: window.getComputedStyle(document.body).height,\n      },\n      documentElement: {\n        overflow: window.getComputedStyle(document.documentElement).overflow,\n        height: window.getComputedStyle(document.documentElement).height,\n      },\n    }\n\n    prescaleHeight = documentHeightOverride\n      ? ~~documentHeightOverride\n      : document.documentElement.scrollHeight\n  }\n\n  const rectsInterval = setInterval(() => {\n    rects = overlayGroup.map((e) => getRect(e.elements.element))\n  }, rectUpdateFrequency)\n\n  const applyMinimap = (): void => {\n    if (scaleFactor >= 1) return\n\n    const skeleton = buildPreviewSkeleton(mousePos, element, scaleFactor)\n\n    handler({\n      type: 'overlay/dragUpdateSkeleton',\n      skeleton,\n    })\n\n    handler({\n      type: 'overlay/dragToggleMinimapPrompt',\n      display: false,\n    })\n\n    applyMinimapWrapperTransform(\n      scaleTarget,\n      scaleFactor,\n      minYScaled,\n      handler,\n      rectUpdateFrequency,\n    ).then(() => {\n      setTimeout(() => {\n        handler({\n          type: 'overlay/dragUpdateGroupRect',\n          groupRect: calcGroupBoundsPreview(rects),\n        })\n      }, rectUpdateFrequency * 2)\n    })\n  }\n\n  const handleScroll = (e: WheelEvent) => {\n    if (\n      Math.abs(e.deltaY) >= 10 &&\n      scaleFactor < 1 &&\n      !minimapScaleApplied &&\n      !minimapPromptShown &&\n      !disableMinimap &&\n      mousedown\n    ) {\n      handler({\n        type: 'overlay/dragToggleMinimapPrompt',\n        display: true,\n      })\n\n      minimapPromptShown = true\n    }\n\n    if (e.shiftKey && !minimapScaleApplied && !disableMinimap) {\n      window.dispatchEvent(new CustomEvent('unstable_sanity/dragApplyMinimap'))\n\n      minimapScaleApplied = true\n\n      setTimeout(() => {\n        applyMinimap()\n      }, 50)\n    }\n  }\n\n  const handleMouseMove = (e: MouseEvent): void => {\n    e.preventDefault()\n\n    mousePos = calcMousePos(e)\n    mousePosInverseTransform = calcMousePosInverseTransform(mousePos)\n\n    if (Math.abs(pointDist(mousePos, initialMousePos)) < minDragDelta) return\n\n    if (!sequenceStarted) {\n      const groupRect = calcGroupBoundsPreview(rects)\n\n      const skeleton = buildPreviewSkeleton(mousePos, element, 1)\n\n      handler({\n        type: 'overlay/dragStart',\n        flow,\n      })\n\n      handler({\n        type: 'overlay/dragUpdateSkeleton',\n        skeleton,\n      })\n\n      handler({\n        type: 'overlay/dragUpdateGroupRect',\n        groupRect,\n      })\n\n      sequenceStarted = true\n      onSequenceStart()\n    }\n\n    handler({\n      type: 'overlay/dragUpdateCursorPosition',\n      x: mousePos.x,\n      y: mousePos.y,\n    })\n\n    if (e.shiftKey && !minimapScaleApplied && !disableMinimap) {\n      window.dispatchEvent(new CustomEvent('unstable_sanity/dragApplyMinimap'))\n\n      minimapScaleApplied = true\n\n      setTimeout(() => {\n        applyMinimap()\n      }, 50)\n    }\n\n    const newInsertPosition = calcInsertPosition(mousePos, rects, flow)\n\n    if (JSON.stringify(insertPosition) !== JSON.stringify(newInsertPosition)) {\n      insertPosition = newInsertPosition\n\n      handler({\n        type: 'overlay/dragUpdateInsertPosition',\n        insertPosition: resolveInsertPosition(overlayGroup, insertPosition, flow),\n      })\n    }\n  }\n\n  const handleMouseUp = (): void => {\n    mousedown = false\n\n    handler({\n      type: 'overlay/dragEnd',\n      target,\n      insertPosition: insertPosition\n        ? resolveInsertPosition(overlayGroup, insertPosition, flow)\n        : null,\n      dragGroup,\n      flow,\n      preventInsertDefault,\n    })\n\n    if (minimapPromptShown) {\n      handler({\n        type: 'overlay/dragToggleMinimapPrompt',\n        display: false,\n      })\n    }\n\n    if (!minimapScaleApplied) {\n      clearInterval(rectsInterval)\n      onSequenceEnd()\n\n      removeFrameListeners()\n      removeKeyListeners()\n    }\n\n    removeMouseListeners()\n  }\n\n  const handleKeyup = (e: KeyboardEvent) => {\n    if (e.key === 'Shift' && minimapScaleApplied) {\n      minimapScaleApplied = false\n\n      const skeleton = buildPreviewSkeleton(mousePos, element, 1 / scaleFactor)\n\n      handler({\n        type: 'overlay/dragUpdateSkeleton',\n        skeleton,\n      })\n\n      window.dispatchEvent(new CustomEvent('unstable_sanity/dragResetMinimap'))\n\n      setTimeout(() => {\n        resetMinimapWrapperTransform(\n          mousePosInverseTransform.y,\n          scaleTarget,\n          prescaleHeight,\n          handler,\n          rectUpdateFrequency,\n          previousRootStyleValues,\n        )\n      }, 50)\n\n      handler({\n        type: 'overlay/dragUpdateGroupRect',\n        groupRect: null,\n      })\n\n      // cleanup keyup after drag sequence is complete\n      if (!mousedown) {\n        clearInterval(rectsInterval)\n\n        removeMouseListeners()\n        removeFrameListeners()\n        removeKeyListeners()\n\n        onSequenceEnd()\n      }\n    }\n  }\n\n  const handleBlur = () => {\n    handler({\n      type: 'overlay/dragUpdateGroupRect',\n      groupRect: null,\n    })\n\n    window.dispatchEvent(new CustomEvent('unstable_sanity/dragResetMinimap'))\n\n    setTimeout(() => {\n      resetMinimapWrapperTransform(\n        mousePosInverseTransform.y,\n        scaleTarget,\n        prescaleHeight,\n        handler,\n        rectUpdateFrequency,\n        previousRootStyleValues,\n      ).then(() => {\n        minimapScaleApplied = false\n      })\n    }, 50)\n\n    clearInterval(rectsInterval)\n\n    removeMouseListeners()\n    removeFrameListeners()\n    removeKeyListeners()\n\n    onSequenceEnd()\n  }\n\n  const removeMouseListeners = () => {\n    window.removeEventListener('mousemove', handleMouseMove)\n    window.removeEventListener('wheel', handleScroll)\n    window.removeEventListener('mouseup', handleMouseUp)\n  }\n\n  const removeKeyListeners = () => {\n    window.removeEventListener('keyup', handleKeyup)\n  }\n\n  const removeFrameListeners = () => {\n    window.removeEventListener('blur', handleBlur)\n  }\n\n  window.addEventListener('blur', handleBlur)\n  window.addEventListener('keyup', handleKeyup)\n  window.addEventListener('wheel', handleScroll)\n  window.addEventListener('mousemove', handleMouseMove)\n  window.addEventListener('mouseup', handleMouseUp)\n}\n","import type {ElementNode} from '../types'\n\nexport const isElementNode = (target: EventTarget | null): target is ElementNode => {\n  return target instanceof HTMLElement || target instanceof SVGElement\n}\n\nexport function findNonInlineElement(element: ElementNode): ElementNode | null {\n  const {display} = window.getComputedStyle(element)\n\n  if (display !== 'inline') return element\n\n  const parent = element.parentElement\n\n  if (!parent) return null\n\n  return findNonInlineElement(parent)\n}\n\nexport const findOverlayElement = (\n  el: EventTarget | ElementNode | null | undefined,\n): ElementNode | null => {\n  if (!el || !isElementNode(el)) {\n    return null\n  }\n\n  if (el.dataset?.['sanityOverlayElement']) {\n    return el\n  }\n\n  return findOverlayElement(el.parentElement)\n}\n","import type {SanityStegaNode} from '@sanity/presentation-comlink'\nimport {vercelStegaDecode} from '@vercel/stega'\nimport {VERCEL_STEGA_REGEX} from '../constants'\n\n/**\n * JavaScript regexps are stateful. Have to reset lastIndex between runs to ensure consistent behaviour for the same string\n * @param input\n */\nexport function testVercelStegaRegex(input: string): boolean {\n  VERCEL_STEGA_REGEX.lastIndex = 0\n  return VERCEL_STEGA_REGEX.test(input)\n}\n\nfunction decodeStega(str: string, isAltText = false): SanityStegaNode | null {\n  try {\n    const decoded = vercelStegaDecode<SanityStegaNode>(str)\n    if (!decoded || decoded.origin !== 'sanity.io') {\n      return null\n    }\n    if (isAltText) {\n      decoded.href = decoded.href?.replace('.alt', '')\n    }\n    return decoded\n  } catch (err) {\n    // eslint-disable-next-line no-console\n    console.error('Failed to decode stega for string: ', str, 'with the original error: ', err)\n    return null\n  }\n}\n\nexport function testAndDecodeStega(str: string, isAltText = false): SanityStegaNode | null {\n  if (testVercelStegaRegex(str)) {\n    return decodeStega(str, isAltText)\n  }\n  return null\n}\n","import {decodeSanityNodeData} from '@sanity/visual-editing-csm'\nimport type {\n  ElementNode,\n  OverlayElement,\n  ResolvedElement,\n  ResolvedElementReason,\n  ResolvedElementTarget,\n  ResolvingElement,\n  SanityNode,\n  SanityStegaNode,\n} from '../types'\nimport {findNonInlineElement} from './elements'\nimport {testAndDecodeStega, testVercelStegaRegex} from './stega'\n\nconst isElementNode = (node: ChildNode): node is ElementNode => node.nodeType === Node.ELEMENT_NODE\n\nconst isImgElement = (el: ElementNode): el is HTMLImageElement => el.tagName === 'IMG'\n\nconst isTimeElement = (el: ElementNode): el is HTMLTimeElement => el.tagName === 'TIME'\n\nconst isSvgRootElement = (el: ElementNode): el is SVGSVGElement =>\n  el.tagName.toUpperCase() === 'SVG'\n\nexport function isSanityNode(node: SanityNode | SanityStegaNode): node is SanityNode {\n  return 'path' in node\n}\n\n/**\n * Finds commonality between two document paths strings\n * @param first First path to compare\n * @param second Second path to compare\n * @returns A common path\n */\nexport function findCommonPath(first: string, second: string): string {\n  let firstParts = first.split('.')\n  let secondParts = second.split('.')\n  const maxLength = Math.min(firstParts.length, secondParts.length)\n  firstParts = firstParts.slice(0, maxLength).reverse()\n  secondParts = secondParts.slice(0, maxLength).reverse()\n\n  return firstParts\n    .reduce((parts, part, i) => (part === secondParts[i] ? [...parts, part] : []), [] as string[])\n    .reverse()\n    .join('.')\n}\n\n/**\n * Returns common Sanity node data from multiple nodes\n * If document paths are present, tries to resolve a common path\n * @param nodes An array of Sanity nodes\n * @returns A single sanity node or undefined\n * @internal\n */\nexport function findCommonSanityData(\n  nodes: (SanityNode | SanityStegaNode)[],\n): SanityNode | SanityStegaNode | undefined {\n  // If there are no nodes, or inconsistent node types\n  if (!nodes.length || !nodes.map((n) => isSanityNode(n)).every((n, _i, arr) => n === arr[0])) {\n    return undefined\n  }\n  // If legacy nodes, return first match (no common pathfinding)\n  if (!isSanityNode(nodes[0])) return nodes[0]\n\n  const sanityNodes = nodes.filter(isSanityNode)\n  let common: SanityNode | undefined = nodes[0]\n\n  const consistentValueKeys: Array<keyof SanityNode> = [\n    'projectId',\n    'dataset',\n    'id',\n    'baseUrl',\n    'workspace',\n    'tool',\n  ]\n  for (let i = 1; i < sanityNodes.length; i++) {\n    const node = sanityNodes[i]\n    if (consistentValueKeys.some((key) => node[key] !== common?.[key])) {\n      common = undefined\n      break\n    }\n\n    common = {...common, path: findCommonPath(common.path, node.path)}\n  }\n\n  return common\n}\n\n/**\n * Finds nodes containing sanity specific data\n * @param el - A parent element to traverse\n * @returns An array of overlay targets\n * @internal\n */\nexport function findSanityNodes(\n  el: ElementNode | ChildNode | {childNodes: Array<ElementNode>},\n): ResolvedElement[] {\n  const mainResults: Omit<ResolvedElement, 'commonSanity'>[] = []\n\n  function createResolvedElement(\n    element: ElementNode,\n    data: SanityStegaNode | string,\n    reason: ResolvedElementReason,\n    preventGrouping?: boolean,\n  ): ResolvingElement | undefined {\n    const sanity = decodeSanityNodeData(data)\n\n    if (!sanity) {\n      return\n    }\n\n    // resize observer does not fire for non-replaced inline elements https://drafts.csswg.org/resize-observer/#intro\n    const measureElement = findNonInlineElement(element)\n    if (!measureElement) {\n      return\n    }\n\n    return {\n      elements: {\n        element,\n        measureElement,\n      },\n      sanity,\n      reason,\n      preventGrouping,\n    }\n  }\n\n  function resolveNode(node: ChildNode): ResolvingElement | undefined {\n    const {nodeType, parentElement, textContent} = node\n    // If an edit target is found, find common paths\n    if (isElementNode(node) && node.dataset?.['sanityEditTarget'] !== undefined) {\n      const nodesInTarget = findSanityNodes(node)\n      const commonData = findCommonSanityData(\n        nodesInTarget\n          .map((node) => (node.type === 'element' ? node.commonSanity : undefined))\n          .filter((n) => n !== undefined),\n      )\n      if (commonData) {\n        return {\n          reason: 'edit-target',\n          elements: {\n            element: node,\n            measureElement: node,\n          },\n          sanity: commonData,\n        }\n      }\n\n      // Check non-empty, child-only text nodes for stega strings\n    } else if (nodeType === Node.TEXT_NODE && parentElement && textContent) {\n      const data = testAndDecodeStega(textContent)\n      if (!data) return\n      return createResolvedElement(parentElement, data, 'stega-text', true)\n    }\n    // Check element nodes for data attributes, alt tags, etc\n    else if (isElementNode(node)) {\n      // Do not traverse script tags\n      // Do not traverse the visual editing overlay\n      if (node.tagName === 'SCRIPT' || node.tagName === 'SANITY-VISUAL-EDITING') {\n        return\n      }\n\n      // Prefer elements with explicit data attributes\n      if (node.dataset?.['sanity']) {\n        return createResolvedElement(\n          node,\n          node.dataset['sanity'],\n          'data-attribute',\n          Boolean(node.textContent && testVercelStegaRegex(node.textContent)),\n        )\n      }\n      // Look for legacy sanity data attributes\n      else if (node.dataset?.['sanityEditInfo']) {\n        return createResolvedElement(\n          node,\n          node.dataset['sanityEditInfo'],\n          'data-attribute',\n          Boolean(node.textContent && testVercelStegaRegex(node.textContent)),\n        )\n      } else if (isImgElement(node)) {\n        const data = testAndDecodeStega(node.alt, true)\n        if (!data) return\n        return createResolvedElement(node, data, 'stega-attribute')\n      } else if (isTimeElement(node)) {\n        const data = testAndDecodeStega(node.dateTime, true)\n        if (!data) return\n        return createResolvedElement(node, data, 'stega-attribute')\n      } else if (isSvgRootElement(node)) {\n        if (!node.ariaLabel) return\n        const data = testAndDecodeStega(node.ariaLabel, true)\n        if (!data) return\n        return createResolvedElement(node, data, 'stega-attribute')\n      }\n    }\n    return\n  }\n\n  function processNode(\n    node: ChildNode,\n    _parentGroup: Omit<ResolvedElement, 'commonSanity'> | undefined,\n  ): void {\n    const resolvedElement = resolveNode(node)\n\n    let parentGroup: Omit<ResolvedElement, 'commonSanity'> | undefined = _parentGroup\n\n    if (isElementNode(node) && node.dataset?.['sanityEditGroup'] !== undefined) {\n      parentGroup = {\n        type: 'group',\n        elements: {\n          element: node,\n          measureElement: node,\n        },\n        targets: [],\n      }\n      mainResults.push(parentGroup)\n    }\n\n    if (resolvedElement) {\n      const target: ResolvedElementTarget = {\n        elements: resolvedElement.elements,\n        sanity: resolvedElement.sanity,\n        reason: resolvedElement.reason,\n      }\n      if (parentGroup && !resolvedElement.preventGrouping) {\n        parentGroup.targets.push(target)\n      } else {\n        mainResults.push({\n          elements: resolvedElement.elements,\n          type: 'element',\n          targets: [target],\n        })\n      }\n    }\n\n    const shouldTraverseNode =\n      isElementNode(node) &&\n      !isImgElement(node) &&\n      !(node.tagName === 'SCRIPT' || node.tagName === 'SANITY-VISUAL-EDITING')\n\n    if (shouldTraverseNode) {\n      for (const childNode of node.childNodes) {\n        processNode(childNode, parentGroup)\n      }\n    }\n  }\n\n  if (el) {\n    for (const node of el.childNodes) {\n      processNode(node, undefined)\n    }\n  }\n\n  return mainResults\n    .map((node) => {\n      if (node.targets.length === 0 && node.type === 'group') {\n        // Always return empty groups so the controller can unregister them\n        return {\n          ...node,\n          commonSanity: undefined,\n        }\n      }\n\n      const commonSanity =\n        node.targets.length === 1\n          ? node.targets[0].sanity\n          : findCommonSanityData(\n              node.targets.map(({sanity}) => sanity).filter((n) => n !== undefined),\n            ) || node.targets[0].sanity\n\n      if (!commonSanity) return null\n\n      return {\n        ...node,\n        commonSanity,\n      }\n    })\n    .filter((node) => node !== null)\n}\n\nexport function isSanityArrayPath(path: string): boolean {\n  const lastDotIndex = path.lastIndexOf('.')\n  const lastPathItem = path.substring(lastDotIndex, path.length)\n\n  return lastPathItem.includes('[')\n}\n\nexport function getSanityNodeArrayPath(path: string): string | null {\n  if (!isSanityArrayPath(path)) return null\n\n  const split = path.split('.')\n\n  split[split.length - 1] = split[split.length - 1].replace(/\\[.*?\\]/g, '[]')\n\n  return split.join('.')\n}\n\nexport function sanityNodesExistInSameArray(\n  sanityNode1: SanityNode,\n  sanityNode2: SanityNode,\n): boolean {\n  if (!isSanityArrayPath(sanityNode1.path) || !isSanityArrayPath(sanityNode2.path)) return false\n\n  return getSanityNodeArrayPath(sanityNode1.path) === getSanityNodeArrayPath(sanityNode2.path)\n}\n\nexport function resolveDragAndDropGroup(\n  element: ElementNode,\n  sanity: SanityNode | SanityStegaNode,\n  elementSet: Set<ElementNode>,\n  elementsMap: WeakMap<ElementNode, OverlayElement>,\n): null | OverlayElement[] {\n  if (!element.getAttribute('data-sanity')) return null\n\n  if (element.getAttribute('data-sanity-drag-disable')) return null\n\n  if (!sanity || !isSanityNode(sanity) || !isSanityArrayPath(sanity.path)) return null\n\n  const targetDragGroup = element.getAttribute('data-sanity-drag-group')\n\n  const group = [...elementSet].reduce<OverlayElement[]>((acc, el) => {\n    const elData = elementsMap.get(el)\n    const elDragDisabled = el.getAttribute('data-sanity-drag-disable')\n    const elDragGroup = el.getAttribute('data-sanity-drag-group')\n    const elHasSanityAttribution = el.getAttribute('data-sanity') !== null\n\n    const sharedDragGroup = targetDragGroup !== null ? targetDragGroup === elDragGroup : true\n\n    if (\n      elData?.sanity &&\n      !elDragDisabled &&\n      isSanityNode(elData.sanity) &&\n      sanityNodesExistInSameArray(sanity, elData.sanity) &&\n      sharedDragGroup &&\n      elHasSanityAttribution\n    ) {\n      acc.push(elData)\n    }\n\n    return acc\n  }, [])\n\n  if (group.length <= 1) return null\n\n  return group\n}\n","import {v4 as uuid} from 'uuid'\nimport type {\n  ElementNode,\n  EventHandlers,\n  OverlayController,\n  OverlayElement,\n  OverlayOptions,\n  ResolvedElement,\n} from './types'\nimport {handleOverlayDrag} from './util/dragAndDrop'\nimport {findOverlayElement, isElementNode} from './util/elements'\nimport {\n  findSanityNodes,\n  isSanityArrayPath,\n  isSanityNode,\n  resolveDragAndDropGroup,\n} from './util/findSanityNodes'\nimport {getRect} from './util/geometry'\n\n/**\n * Creates a controller which dispatches overlay related events\n *\n * @param handler - Dispatched event handler\n * @param overlayElement - Parent element containing rendered overlay elements\n * @public\n */\nexport function createOverlayController({\n  handler,\n  overlayElement,\n  inFrame,\n  inPopUp,\n  optimisticActorReady,\n}: OverlayOptions): OverlayController {\n  let activated = false\n  // Map for getting element by ID\n  const elementIdMap = new Map<string, ElementNode>()\n  // WeakMap for getting data by element\n  const elementsMap = new WeakMap<ElementNode, OverlayElement>()\n  // Set for iterating over elements\n  const elementSet = new Set<ElementNode>()\n  // Weakmap keyed by measureElement to find associated element\n  const measureElements = new WeakMap<ElementNode, ElementNode>()\n  // Weakmap for storing user set cursor styles per element\n  const cursorMap = new WeakMap<ElementNode, string | undefined>()\n\n  let ro: ResizeObserver\n  let io: IntersectionObserver | undefined\n  let mo: MutationObserver\n\n  let activeDragSequence = false\n\n  // The `hoverStack` is used as a container for tracking which elements are hovered at any time.\n  // The browser supports hovering multiple nested elements simultanously, but we only want to\n  // highlight the \"outer most\" element.\n  //\n  // This is how it works:\n  // - Whenever the mouse enters an element, we add it to the stack.\n  // - Whenever the mouse leaves an element, we remove it from the stack.\n  //\n  // When we want to know which element is currently hovered, we take the element at the top of the\n  // stack. Since JavaScript does not have a Stack type, we use an array and take the last element.\n  let hoverStack: Array<ElementNode> = []\n  const getHoveredElement = () => hoverStack[hoverStack.length - 1] as ElementNode | undefined\n\n  function addEventHandlers(el: ElementNode, handlers: EventHandlers) {\n    el.addEventListener('click', handlers.click as EventListener, {\n      capture: true,\n    })\n    el.addEventListener('contextmenu', handlers.contextmenu as EventListener, {\n      capture: true,\n    })\n    // We listen for the initial mousemove event, in case the overlay is enabled whilst the cursor is already over an element\n    // mouseenter and mouseleave listeners are attached within this handler\n    el.addEventListener('mousemove', handlers.mousemove as EventListener, {\n      once: true,\n      capture: true,\n    })\n    // Listen for mousedown in case we need to prevent default behavior\n    el.addEventListener('mousedown', handlers.mousedown as EventListener, {\n      capture: true,\n    })\n  }\n\n  function removeEventHandlers(el: ElementNode, handlers: EventHandlers) {\n    el.removeEventListener('click', handlers.click as EventListener, {\n      capture: true,\n    })\n    el.removeEventListener('contextmenu', handlers.contextmenu as EventListener, {\n      capture: true,\n    })\n    el.removeEventListener('mousemove', handlers.mousemove as EventListener, {\n      capture: true,\n    })\n    el.removeEventListener('mousedown', handlers.mousedown as EventListener, {\n      capture: true,\n    })\n    el.removeEventListener('mouseenter', handlers.mouseenter as EventListener)\n    el.removeEventListener('mouseleave', handlers.mouseleave as EventListener)\n  }\n\n  /**\n   * Executed when element enters the viewport\n   * Enables an element’s event handlers\n   */\n  function activateElement({id, elements, handlers}: OverlayElement) {\n    const {element, measureElement} = elements\n    addEventHandlers(element, handlers)\n    ro.observe(measureElement)\n    handler({\n      type: 'element/activate',\n      id,\n    })\n  }\n\n  /**\n   * Executed when element leaves the viewport\n   * Disables an element’s event handlers\n   */\n  function deactivateElement({id, elements, handlers}: OverlayElement) {\n    const {element, measureElement} = elements\n    removeEventHandlers(element, handlers)\n    ro.unobserve(measureElement)\n    // Scrolling from a hovered element will not trigger mouseleave event, so filter the stack\n    hoverStack = hoverStack.filter((el) => el !== element)\n    handler({\n      type: 'element/deactivate',\n      id,\n    })\n  }\n\n  function setOverlayCursor(element: ElementNode) {\n    // Don't set the cursor if mutations are unavailable\n    if ((!inFrame && !inPopUp) || !optimisticActorReady) return\n\n    // Loops through the entire hoverStack, trying to set the cursor if the\n    // stack element matches the element passed to the function, otherwise\n    // restoring the cursor\n    for (const hoverstackElement of hoverStack) {\n      if (element === hoverstackElement) {\n        const targetSanityData = elementsMap.get(element)?.sanity\n        if (!targetSanityData || !isSanityNode(targetSanityData)) return\n\n        const dragGroup = resolveDragAndDropGroup(\n          element,\n          targetSanityData,\n          elementSet,\n          elementsMap,\n        )\n\n        if (dragGroup) {\n          // Store any existing cursor so it can be restored later\n          const existingCursor = element.style.cursor\n          if (existingCursor) {\n            cursorMap.set(element, existingCursor)\n          }\n\n          handler({\n            type: 'overlay/setCursor',\n            element,\n            cursor: 'move',\n          })\n\n          continue\n        }\n      }\n\n      restoreOverlayCursor(hoverstackElement)\n    }\n  }\n\n  function restoreOverlayCursor(element: ElementNode) {\n    // Restore any previously stored cursor (if it exists)\n    const previousCursor = cursorMap.get(element)\n\n    handler({\n      type: 'overlay/setCursor',\n      element,\n      cursor: previousCursor,\n    })\n  }\n\n  /**\n   * Stores an element’s DOM node and decoded sanity data in state and sets up event handlers\n   */\n  function registerElement({type, elements, commonSanity, targets}: ResolvedElement) {\n    const {element, measureElement} = elements\n\n    const eventHandlers: EventHandlers = {\n      click(event) {\n        const target = event.target as ElementNode | null\n\n        if (element === getHoveredElement() && element.contains(target)) {\n          // Click events are only supported supported in iframes, not well supported in popups\n          // @TODO presentation tool should report wether it's visible or not, so we can adapt properly and allow multi-window preview workflows\n          if (inFrame) {\n            event.preventDefault()\n            event.stopPropagation()\n          }\n\n          const sanity = elementsMap.get(element)?.sanity\n          if (sanity && !activeDragSequence) {\n            handler({\n              type: 'element/click',\n              id,\n              sanity,\n            })\n          }\n        }\n      },\n      contextmenu(event) {\n        if (!('path' in commonSanity!) || (!inFrame && !inPopUp) || !optimisticActorReady) return\n\n        // This is a temporary check as the context menu only supports array\n        // items (for now). We split the path into segments, if a `_key` exists\n        // in last path segment, we assume it's an array item, and so return\n        // early if it is some other type.\n        if (!commonSanity.path.split('.').pop()?.includes('[_key==')) return\n\n        const target = event.target as ElementNode | null\n        if (element === getHoveredElement() && element.contains(target)) {\n          // Context menus are supported on both iframes and popups\n          if (inFrame || inPopUp) {\n            event.preventDefault()\n            event.stopPropagation()\n          }\n          handler({\n            type: 'element/contextmenu',\n            id,\n            position: {\n              x: event.clientX,\n              y: event.clientY,\n            },\n            sanity: commonSanity,\n          })\n        }\n      },\n      mousedown(event) {\n        // prevent iframe from taking focus\n        event.preventDefault()\n\n        if (event.currentTarget !== hoverStack.at(-1)) return\n\n        if (element.getAttribute('data-sanity-drag-disable')) return\n\n        // disable dnd in non-studio contexts\n        if ((!inFrame && !inPopUp) || !optimisticActorReady) return\n\n        const targetSanityData = elementsMap.get(element)?.sanity\n\n        if (\n          !targetSanityData ||\n          !isSanityNode(targetSanityData) ||\n          !isSanityArrayPath(targetSanityData.path)\n        )\n          return\n\n        const dragGroup = resolveDragAndDropGroup(element, commonSanity!, elementSet, elementsMap)\n\n        if (!dragGroup) return\n\n        handleOverlayDrag({\n          element,\n          handler,\n          mouseEvent: event as MouseEvent,\n          overlayGroup: dragGroup,\n          target: targetSanityData,\n          onSequenceStart: () => {\n            activeDragSequence = true\n          },\n          onSequenceEnd: () => {\n            // delay drag sequence end to prevent click events from firing just after drag sequences\n            setTimeout(() => {\n              activeDragSequence = false\n            }, 250)\n          },\n        })\n      },\n      mousemove(event) {\n        eventHandlers.mouseenter(event)\n        const el = event.currentTarget as ElementNode | null\n        if (el) {\n          el.addEventListener('mouseenter', eventHandlers.mouseenter as EventListener)\n          el.addEventListener('mouseleave', eventHandlers.mouseleave as EventListener)\n        }\n      },\n      mouseenter() {\n        // If the Vercel Visual Editing provided by Vercel Toolbar is active, do not overlap overlays\n        if (\n          (document.querySelector('vercel-live-feedback') &&\n            element.closest('[data-vercel-edit-info]')) ||\n          element.closest('[data-vercel-edit-target]')\n        ) {\n          return\n        }\n        hoverStack.push(element)\n\n        handler({\n          type: 'element/mouseenter',\n          id,\n          rect: getRect(element),\n        })\n\n        setOverlayCursor(element)\n      },\n      mouseleave(e) {\n        function leave() {\n          hoverStack.pop()\n          const hoveredElement = getHoveredElement()\n\n          handler({\n            type: 'element/mouseleave',\n            id,\n          })\n\n          if (hoveredElement) {\n            setOverlayCursor(hoveredElement)\n            const overlayElement = elementsMap.get(hoveredElement)\n            if (overlayElement) {\n              handler({\n                type: 'element/mouseenter',\n                id: overlayElement.id,\n                rect: getRect(hoveredElement),\n              })\n            }\n          }\n\n          restoreOverlayCursor(element)\n        }\n\n        /**\n         * If moving to an element within the overlay which handles pointer events, attach a new\n         * event handler to that element and defer the original leave event\n         */\n        function addDeferredLeave(el: ElementNode) {\n          const deferredLeave = (e: MouseEvent) => {\n            const {relatedTarget} = e\n            const deferredContainer = findOverlayElement(relatedTarget)\n            if (!deferredContainer) {\n              el.removeEventListener('mouseleave', deferredLeave as EventListener)\n              leave()\n            } else if (relatedTarget && isElementNode(relatedTarget)) {\n              el.removeEventListener('mouseleave', deferredLeave as EventListener)\n              addDeferredLeave(relatedTarget)\n            }\n          }\n          el.addEventListener('mouseleave', deferredLeave as EventListener)\n        }\n\n        const {relatedTarget} = e as MouseEvent\n        const container = findOverlayElement(relatedTarget)\n        const isInteractiveOverlayElement = overlayElement.contains(container)\n\n        if (isElementNode(container) && isInteractiveOverlayElement) {\n          return addDeferredLeave(container)\n        }\n\n        leave()\n      },\n    }\n\n    const id = uuid()\n    const sanityNode = {\n      type,\n      id,\n      elements,\n      sanity: commonSanity,\n      handlers: eventHandlers,\n    }\n    elementSet.add(element)\n    measureElements.set(measureElement, element)\n    elementIdMap.set(id, element)\n    elementsMap.set(element, sanityNode)\n\n    io?.observe(element)\n\n    handler({\n      type: 'element/register',\n      elementType: type,\n      id,\n      element,\n      rect: getRect(element),\n      sanity: commonSanity!,\n      dragDisabled: !!element.getAttribute('data-sanity-drag-disable'),\n      targets: targets.map((target) => ({\n        sanity: target.sanity,\n        element: target.elements.element,\n      })),\n    })\n\n    if (activated) {\n      activateElement(sanityNode)\n    }\n  }\n\n  function updateElement(resolvedElement: ResolvedElement) {\n    const {element} = resolvedElement.elements\n    const overlayElement = elementsMap.get(element)\n    if (overlayElement) {\n      elementsMap.set(element, {...overlayElement, sanity: resolvedElement.commonSanity})\n      handler({\n        type: 'element/update',\n        elementType: overlayElement.type,\n        id: overlayElement.id,\n        rect: getRect(element),\n        sanity: resolvedElement.commonSanity!,\n        targets: resolvedElement.targets.map((target) => ({\n          sanity: target.sanity,\n          element: target.elements.element,\n        })),\n      })\n    }\n  }\n\n  function parseElements(node: ElementNode | {childNodes: ElementNode[]}) {\n    const sanityNodes = findSanityNodes(node)\n\n    for (const sanityNode of sanityNodes) {\n      if (sanityNode.type === 'group') {\n        for (const target of sanityNode.targets) {\n          // Any child target of a group should be unregistered if registered as an element\n          const overlayElement = elementsMap.get(target.elements.element)\n          if (overlayElement && overlayElement.type === 'element') {\n            unregisterElement(target.elements.element)\n          }\n        }\n        if (sanityNode.targets.length === 0) {\n          // Group was updated without children, unregister the element\n          unregisterElement(sanityNode.elements.element)\n        }\n      }\n\n      if (!sanityNode.commonSanity) continue\n\n      const {element} = sanityNode.elements\n      if (elementsMap.has(element)) {\n        updateElement(sanityNode)\n      } else {\n        registerElement(sanityNode)\n      }\n    }\n  }\n\n  function unregisterElement(element: ElementNode) {\n    const overlayElement = elementsMap.get(element)\n    if (overlayElement) {\n      const {id, handlers} = overlayElement\n      removeEventHandlers(element, handlers)\n      ro.unobserve(element)\n      elementsMap.delete(element)\n      elementSet.delete(element)\n      elementIdMap.delete(id)\n      handler({\n        type: 'element/unregister',\n        id,\n      })\n    }\n  }\n\n  function handleMutation(mutations: MutationRecord[]) {\n    let mutationWasInScope = false\n    // For each DOM mutation, we find the relevant element node and register or\n    // update it. This function doesn't handle checking if the node actually\n    // contains any relevant Sanity data, it just detects new or changed DOM\n    // elements and hands them off to `parseElements` to and determine if we\n    // have Sanity nodes\n    for (const mutation of mutations) {\n      const {target, type} = mutation\n      // We need to target an element, so if the mutated node was just a text\n      // change, we look at that node's parent instead\n      const node: Node | null = type === 'characterData' ? target.parentElement : target\n      // We ignore any nodes related to the overlay container element\n      if (node === overlayElement || overlayElement.contains(node)) {\n        continue\n      }\n\n      mutationWasInScope = true\n      if (isElementNode(node)) {\n        const possibleGroupParent = node.parentElement?.closest('[data-sanity-edit-group]') || null\n        const updateNodeTarget = isElementNode(possibleGroupParent) ? possibleGroupParent : node\n        parseElements({childNodes: [updateNodeTarget]})\n      }\n    }\n\n    // If the mutation is \"in scope\" (i.e. happened outside of the overlay\n    // container) we need to check if it removed any of the elements we are\n    // currently tracking\n    if (mutationWasInScope) {\n      for (const element of elementSet) {\n        if (!element.isConnected) {\n          unregisterElement(element)\n        }\n        // If the element was a group and is no longer a group, unregister it\n        const overlayElement = elementsMap.get(element)\n        if (overlayElement?.type === 'group' && !element.hasAttribute('data-sanity-edit-group')) {\n          unregisterElement(element)\n        }\n      }\n    }\n  }\n\n  function updateRect(el: ElementNode) {\n    const overlayElement = elementsMap.get(el)\n    if (overlayElement) {\n      handler({\n        type: 'element/updateRect',\n        id: overlayElement.id,\n        rect: getRect(el),\n      })\n    }\n  }\n\n  function handleResize(entries: ResizeObserverEntry[]) {\n    for (const entry of entries) {\n      const target = entry.target\n\n      if (isElementNode(target)) {\n        const element = measureElements.get(target)\n        if (!element) return\n        updateRect(element)\n      }\n    }\n  }\n\n  function handleIntersection(entries: IntersectionObserverEntry[]) {\n    if (!activated) return\n    for (const entry of entries) {\n      const {target} = entry\n      const match = isElementNode(target) && elementsMap.get(target)\n      if (!match) continue\n      if (entry.isIntersecting) {\n        activateElement(match)\n      } else {\n        deactivateElement(match)\n      }\n    }\n  }\n\n  function handleBlur(event: MouseEvent) {\n    const element = findOverlayElement(event.target)\n\n    if (element) {\n      if (element.dataset['sanityOverlayElement'] === 'capture') {\n        event.preventDefault()\n        event.stopPropagation()\n      }\n      return\n    }\n\n    hoverStack = []\n    handler({\n      type: 'overlay/blur',\n    })\n  }\n\n  function handleExclusivePluginClosed() {\n    hoverStack = []\n    handler({\n      type: 'overlay/reset-mouse-state',\n    })\n  }\n\n  function handleWindowResize() {\n    for (const element of elementSet) {\n      updateRect(element)\n    }\n  }\n\n  function handleKeydown(event: KeyboardEvent) {\n    if (event.key === 'Escape') {\n      hoverStack = []\n      handler({\n        type: 'overlay/blur',\n      })\n    }\n  }\n\n  function handleWindowScroll(event: Event) {\n    const {target} = event\n\n    if (target === window.document || !isElementNode(target)) {\n      return\n    }\n\n    for (const element of elementSet) {\n      if (target.contains(element)) {\n        updateRect(element)\n      }\n    }\n  }\n\n  function activate() {\n    if (activated) return\n    io = new IntersectionObserver(handleIntersection, {\n      threshold: 0.3,\n    })\n    elementSet.forEach((element) => io!.observe(element))\n    handler({\n      type: 'overlay/activate',\n    })\n    activated = true\n  }\n\n  function deactivate() {\n    if (!activated) return\n    io?.disconnect()\n    elementSet.forEach((element) => {\n      const overlayElement = elementsMap.get(element)\n      if (overlayElement) {\n        deactivateElement(overlayElement)\n      }\n    })\n    handler({\n      type: 'overlay/deactivate',\n    })\n    activated = false\n  }\n\n  function handleHeaderClick(event: CustomEvent<{id: string}>) {\n    const {id} = event.detail\n    const element = elementIdMap.get(id)\n    if (!element) return\n    const sanity = elementsMap.get(element)?.sanity\n    if (!sanity) return\n    handler({\n      type: 'element/click',\n      id,\n      sanity,\n    })\n  }\n\n  function destroy() {\n    window.removeEventListener('click', handleBlur)\n    window.removeEventListener('contextmenu', handleBlur)\n    window.removeEventListener(\n      'sanity-overlay/exclusive-plugin-closed',\n      handleExclusivePluginClosed,\n    )\n    window.removeEventListener('sanity-overlay/label-click', handleHeaderClick as EventListener)\n    window.removeEventListener('keydown', handleKeydown)\n    window.removeEventListener('resize', handleWindowResize)\n    window.removeEventListener('scroll', handleWindowScroll)\n    mo.disconnect()\n    ro.disconnect()\n\n    elementSet.forEach((element) => {\n      unregisterElement(element)\n    })\n\n    elementIdMap.clear()\n    elementSet.clear()\n\n    hoverStack = []\n    deactivate()\n  }\n\n  function create() {\n    window.addEventListener('click', handleBlur)\n    window.addEventListener('contextmenu', handleBlur)\n    window.addEventListener('sanity-overlay/exclusive-plugin-closed', handleExclusivePluginClosed)\n    window.addEventListener('sanity-overlay/label-click', handleHeaderClick as EventListener)\n    window.addEventListener('keydown', handleKeydown)\n    window.addEventListener('resize', handleWindowResize)\n    window.addEventListener('scroll', handleWindowScroll, {\n      capture: true,\n      passive: true,\n    })\n    ro = new ResizeObserver(handleResize)\n    mo = new MutationObserver(handleMutation)\n    mo.observe(document.body, {\n      attributes: true,\n      characterData: true,\n      childList: true,\n      subtree: true,\n    })\n\n    parseElements(document.body)\n    activate()\n  }\n\n  window.document.fonts.ready.then(() => {\n    for (const element of elementSet) {\n      updateRect(element)\n    }\n  })\n\n  create()\n\n  return {\n    activate,\n    deactivate,\n    destroy,\n  }\n}\n","import {createContext} from 'react'\nimport type {VisualEditingNode} from '../../types'\nimport type {SharedStateStore} from './sharedStateStore'\n\nexport interface SharedStateContextValue {\n  comlink?: VisualEditingNode\n  store: SharedStateStore\n}\n\nexport const SharedStateContext = createContext<SharedStateContextValue | null>(null)\n"],"names":["useOptimistic","passthrough","reducer","$","_c","pristine","setPristine","useState","optimistic","setOptimistic","lastEvent","setLastEvent","lastPassthrough","setLastPassthrough","actor","useOptimisticActor","t0","action","prevState","Array","isArray","reduce","acc","reducer_0","document","id","getPublishedId","originalId","type","reduceStateFromAction","useEffectEvent","t1","updateLastPassthrough","t2","isEmptyActor","pristineTimeout","rebasedSub","on","_event","event","prevState_0","clearTimeout","pristineSub","unsubscribe","t3","useEffect","t4","Error","startTransition","t5","byteToHex","i","push","toString","slice","unsafeStringify","arr","offset","toLowerCase","getRandomValues","rnds8","Uint8Array","rng","crypto","bind","randomUUID","v4","options","buf","native","rnds","random","length","getRect","element","domRect","getBoundingClientRect","x","scrollX","y","scrollY","w","width","h","height","offsetRect","rect","px","axis","rayIntersect","l1","l2","x1","y1","x2","y2","x3","y3","x4","y4","denominator","ua","ub","rectEqual","r1","r2","rayRectIntersections","line","rectLines","intersections","intersection","isDuplicate","j","sort","a","b","pointDist","p1","p2","Math","sqrt","pointInBounds","point","bounds","withinX","withinY","findClosestIntersection","ray","targets","flow","rayOrigin","some","t","min","closestIntersection","closestRect","target","firstIntersection","scaleRect","scale","origin","originX","originY","newX","newY","newWidth","newHeight","getRectGroupXExtent","rects","minGroupX","max","map","r","maxGroupX","body","offsetWidth","getRectGroupYExtent","minGroupY","maxGroupY","scrollHeight","calcTargetFlow","filter","calcInsertPosition","rayLeft","rayRight","left","right","rayTop","rayBottom","top","bottom","findRectSanityData","overlayGroup","find","e","elements","sanity","resolveInsertPosition","insertPosition","Object","values","every","v","calcMousePos","bodyBounds","clientX","clientY","window","calcMousePosInverseTransform","mousePos","transform","getComputedStyle","inverseMatrix","DOMMatrix","inverse","transformedPoint","DOMPoint","matrixTransform","buildPreviewSkeleton","scaleFactor","children","querySelectorAll","childRects","child","tagName","offsetX","offsetY","maxWidth","minDragDelta","applyMinimapWrapperTransform","minYScaled","handler","rectUpdateFrequency","Promise","resolve","addEventListener","setTimeout","once","display","style","overflow","documentElement","transformOrigin","transition","calcMinimapTransformValues","groupHeightOverride","groupHeight","padding","innerHeight","scaledRects","innerWidth","calcGroupBoundsPreview","groupBoundsX","groupBoundsY","offsetDist","canOffsetX","canOffsetY","canOffset","resetMinimapWrapperTransform","endYOrigin","prescaleHeight","previousRootStyleValues","maxScroll","prevScrollY","scrollTo","behavior","minimapScaleApplied","mousePosInverseTransform","handleOverlayDrag","opts","mouseEvent","onSequenceStart","onSequenceEnd","button","focus","getAttribute","dragGroup","disableMinimap","preventInsertDefault","documentHeightOverride","initialMousePos","scaleTarget","sequenceStarted","minimapPromptShown","mousedown","rectsInterval","setInterval","applyMinimap","skeleton","then","groupRect","handleScroll","abs","deltaY","shiftKey","dispatchEvent","CustomEvent","handleMouseMove","preventDefault","newInsertPosition","JSON","stringify","handleMouseUp","clearInterval","removeFrameListeners","removeKeyListeners","removeMouseListeners","handleKeyup","key","handleBlur","removeEventListener","isElementNode","HTMLElement","SVGElement","findNonInlineElement","parent","parentElement","findOverlayElement","el","dataset","testVercelStegaRegex","input","VERCEL_STEGA_REGEX","lastIndex","test","decodeStega","str","isAltText","decoded","vercelStegaDecode","href","replace","err","console","error","testAndDecodeStega","node","nodeType","Node","ELEMENT_NODE","isImgElement","isTimeElement","isSvgRootElement","toUpperCase","isSanityNode","findCommonPath","first","second","firstParts","split","secondParts","maxLength","reverse","parts","part","join","findCommonSanityData","nodes","n","_i","sanityNodes","common","consistentValueKeys","undefined","path","findSanityNodes","mainResults","createResolvedElement","data","reason","preventGrouping","decodeSanityNodeData","measureElement","resolveNode","textContent","nodesInTarget","commonData","commonSanity","TEXT_NODE","Boolean","alt","dateTime","ariaLabel","processNode","_parentGroup","resolvedElement","parentGroup","childNode","childNodes","isSanityArrayPath","lastDotIndex","lastIndexOf","substring","includes","getSanityNodeArrayPath","sanityNodesExistInSameArray","sanityNode1","sanityNode2","resolveDragAndDropGroup","elementSet","elementsMap","targetDragGroup","group","elData","get","elDragDisabled","elDragGroup","elHasSanityAttribution","sharedDragGroup","createOverlayController","overlayElement","inFrame","inPopUp","optimisticActorReady","activated","elementIdMap","Map","WeakMap","Set","measureElements","cursorMap","ro","io","mo","activeDragSequence","hoverStack","getHoveredElement","addEventHandlers","handlers","click","capture","contextmenu","mousemove","removeEventHandlers","mouseenter","mouseleave","activateElement","observe","deactivateElement","unobserve","setOverlayCursor","hoverstackElement","targetSanityData","existingCursor","cursor","set","restoreOverlayCursor","previousCursor","registerElement","eventHandlers","contains","stopPropagation","pop","position","currentTarget","at","querySelector","closest","leave","hoveredElement","addDeferredLeave","deferredLeave","relatedTarget","container","isInteractiveOverlayElement","uuid","sanityNode","add","elementType","dragDisabled","updateElement","parseElements","unregisterElement","has","delete","handleMutation","mutations","mutationWasInScope","mutation","possibleGroupParent","updateNodeTarget","isConnected","hasAttribute","updateRect","handleResize","entries","entry","handleIntersection","match","isIntersecting","handleExclusivePluginClosed","handleWindowResize","handleKeydown","handleWindowScroll","activate","IntersectionObserver","threshold","forEach","deactivate","disconnect","handleHeaderClick","detail","destroy","clear","create","passive","ResizeObserver","MutationObserver","attributes","characterData","childList","subtree","fonts","ready","SharedStateContext","createContext"],"mappings":"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","x_google_ignoreList":[1,2,3,4]}