{"version":3,"sources":["../../src/canvas/index.tsx","../../src/canvas/getPageViewState.ts","../../src/utils/geometry.ts","../../src/canvas/ToolpadBridge.tsx","../../src/canvas/BridgeContext.ts"],"sourcesContent":["import * as React from 'react';\nimport invariant from 'invariant';\nimport { throttle } from 'lodash-es';\nimport { CanvasEventsContext } from '@mui/toolpad-core/runtime';\nimport ToolpadApp, { LoadComponents, queryClient } from '../runtime/ToolpadApp';\nimport { AppCanvasState } from '../types';\nimport getPageViewState from './getPageViewState';\nimport { rectContainsPoint } from '../utils/geometry';\nimport { CanvasHooks, CanvasHooksContext } from '../runtime/CanvasHooksContext';\nimport { bridge, setCommandHandler } from './ToolpadBridge';\nimport { BridgeContext } from './BridgeContext';\n\nconst handleScreenUpdate = throttle(\n  () => {\n    bridge.canvasEvents.emit('screenUpdate', {});\n  },\n  50,\n  { trailing: true },\n);\n\nexport interface AppCanvasProps {\n  initialState?: AppCanvasState | null;\n  basename: string;\n  loadComponents: LoadComponents;\n}\n\nexport default function AppCanvas({\n  loadComponents,\n  basename,\n  initialState = null,\n}: AppCanvasProps) {\n  const [state, setState] = React.useState<AppCanvasState | null>(initialState);\n\n  const appRootRef = React.useRef<HTMLDivElement>();\n  const appRootCleanupRef = React.useRef<() => void>();\n  const onAppRoot = React.useCallback((appRoot: HTMLDivElement) => {\n    appRootCleanupRef.current?.();\n    appRootCleanupRef.current = undefined;\n\n    if (!appRoot) {\n      return;\n    }\n\n    appRootRef.current = appRoot;\n\n    const mutationObserver = new MutationObserver(handleScreenUpdate);\n\n    mutationObserver.observe(appRoot, {\n      attributes: true,\n      childList: true,\n      subtree: true,\n      characterData: true,\n    });\n\n    const resizeObserver = new ResizeObserver(handleScreenUpdate);\n\n    resizeObserver.observe(appRoot);\n    appRoot.querySelectorAll('*').forEach((elm) => resizeObserver.observe(elm));\n\n    appRootCleanupRef.current = () => {\n      handleScreenUpdate.cancel();\n      mutationObserver.disconnect();\n      resizeObserver.disconnect();\n    };\n  }, []);\n\n  React.useEffect(\n    () => () => {\n      appRootCleanupRef.current?.();\n      appRootCleanupRef.current = undefined;\n    },\n    [],\n  );\n\n  // Notify host after every render\n  React.useEffect(() => {\n    if (appRootRef.current) {\n      // Only notify screen updates if the approot is rendered\n      handleScreenUpdate();\n    }\n  });\n\n  React.useEffect(() => {\n    const unsetGetPageViewState = setCommandHandler(\n      bridge.canvasCommands,\n      'getPageViewState',\n      () => {\n        invariant(appRootRef.current, 'App ref not attached');\n        return getPageViewState(appRootRef.current);\n      },\n    );\n\n    const unsetGetViewCoordinates = setCommandHandler(\n      bridge.canvasCommands,\n      'getViewCoordinates',\n      (clientX, clientY) => {\n        if (!appRootRef.current) {\n          return null;\n        }\n        const rect = appRootRef.current.getBoundingClientRect();\n        if (rectContainsPoint(rect, clientX, clientY)) {\n          return { x: clientX - rect.x, y: clientY - rect.y };\n        }\n        return null;\n      },\n    );\n\n    const unsetUpdate = setCommandHandler(bridge.canvasCommands, 'update', (newState) => {\n      React.startTransition(() => setState(structuredClone(newState)));\n    });\n\n    const unsetInvalidateQueries = setCommandHandler(\n      bridge.canvasCommands,\n      'invalidateQueries',\n      () => {\n        queryClient.invalidateQueries();\n      },\n    );\n\n    bridge.canvasEvents.emit('ready', {});\n\n    return () => {\n      unsetGetPageViewState();\n      unsetGetViewCoordinates();\n      unsetUpdate();\n      unsetInvalidateQueries();\n    };\n  }, []);\n\n  const savedNodes = state?.savedNodes;\n  const editorHooks: CanvasHooks = React.useMemo(() => {\n    return {\n      savedNodes,\n    };\n  }, [savedNodes]);\n\n  return state ? (\n    <BridgeContext.Provider value={bridge}>\n      <CanvasHooksContext.Provider value={editorHooks}>\n        <CanvasEventsContext.Provider value={bridge.canvasEvents}>\n          <ToolpadApp\n            rootRef={onAppRoot}\n            loadComponents={loadComponents}\n            hasShell={false}\n            basename={basename}\n            state={state}\n          />\n        </CanvasEventsContext.Provider>\n      </CanvasHooksContext.Provider>\n    </BridgeContext.Provider>\n  ) : null;\n}\n","import type { FiberNode, Hook } from 'react-devtools-inline';\nimport { NodeId, RUNTIME_PROP_NODE_ID, RUNTIME_PROP_SLOTS, SlotType } from '@mui/toolpad-core';\nimport { NodeFiberHostProps } from '@mui/toolpad-core/runtime';\nimport { PageViewState, NodesInfo, NodeInfo, FlowDirection } from '../types';\nimport { getRelativeBoundingRect, getRelativeOuterRect } from '../utils/geometry';\n\ndeclare global {\n  interface Window {\n    __REACT_DEVTOOLS_GLOBAL_HOOK__?: Hook;\n  }\n}\n\nfunction getNodeViewInfo(\n  fiber: FiberNode,\n  viewElm: Element,\n  elm: Element,\n  nodeId: NodeId,\n  fiberHostProps: NodeFiberHostProps,\n): NodeInfo | null {\n  if (nodeId) {\n    const rect = getRelativeOuterRect(viewElm, elm);\n    const props = fiber.child?.memoizedProps ?? {};\n\n    return {\n      nodeId,\n      error: fiberHostProps.nodeError,\n      componentConfig: fiberHostProps.componentConfig,\n      rect,\n      slots: {},\n      props,\n    };\n  }\n  return null;\n}\n\nfunction walkFibers(node: FiberNode, visitor: (node: FiberNode) => void) {\n  visitor(node);\n  if (node.child) {\n    walkFibers(node.child, visitor);\n  }\n  if (node.sibling) {\n    walkFibers(node.sibling, visitor);\n  }\n}\n\nexport function getNodesViewInfo(rootElm: HTMLElement): {\n  nodes: NodesInfo;\n} {\n  // eslint-disable-next-line no-underscore-dangle\n  const devtoolsHook = rootElm.ownerDocument.defaultView?.__REACT_DEVTOOLS_GLOBAL_HOOK__;\n\n  if (!devtoolsHook) {\n    console.warn(`Can't read page layout as react devtools are not installed`);\n    return { nodes: {} };\n  }\n\n  const nodes: NodesInfo = {};\n\n  const rendererId = 1;\n  const nodeElms = new Map<NodeId, Element>();\n  Array.from(devtoolsHook.getFiberRoots(rendererId)).forEach((fiberRoot) => {\n    if (fiberRoot.current) {\n      walkFibers(fiberRoot.current, (fiber) => {\n        if (!fiber.memoizedProps) {\n          return;\n        }\n\n        const nodeIdPropValue = fiber.memoizedProps[RUNTIME_PROP_NODE_ID] as string | undefined;\n\n        if (nodeIdPropValue) {\n          const fiberHostProps = fiber.memoizedProps as unknown as NodeFiberHostProps;\n\n          const nodeId = fiberHostProps[RUNTIME_PROP_NODE_ID] as NodeId;\n          if (nodes[nodeId]) {\n            // We can get multiple fibers with the [RUNTIME_PROP_NODE_ID] if the component\n            // spreads its props. Let's assume the first we encounter is the one wrapped by\n            // the code generator and bail out on any subsequent ones.\n            return;\n          }\n\n          const elm = devtoolsHook.renderers.get(rendererId)?.findHostInstanceByFiber(fiber);\n          if (elm) {\n            nodeElms.set(nodeId, elm);\n            const info = getNodeViewInfo(fiber, rootElm, elm, nodeId, fiberHostProps);\n            if (info) {\n              nodes[nodeId] = info;\n            }\n          }\n        }\n\n        const slotNamePropValue = fiber.memoizedProps[RUNTIME_PROP_SLOTS] as string | undefined;\n        if (slotNamePropValue) {\n          const slotType = fiber.memoizedProps.slotType as SlotType;\n          const parentId: NodeId = fiber.memoizedProps.parentId as NodeId;\n          const nodeSlots = nodes[parentId]?.slots;\n\n          // If there are 2 slots for the same prop name, consider only the first one\n          if (nodeSlots && nodeSlots[slotNamePropValue]) {\n            return;\n          }\n\n          const firstChildElm = devtoolsHook.renderers\n            .get(rendererId)\n            ?.findHostInstanceByFiber(fiber);\n\n          const childContainerElm = firstChildElm?.parentElement;\n\n          if (childContainerElm && nodeSlots) {\n            const rect =\n              slotType === 'single' || slotType === 'layout'\n                ? getRelativeBoundingRect(rootElm, firstChildElm)\n                : getRelativeBoundingRect(rootElm, childContainerElm);\n\n            const display = window.getComputedStyle(childContainerElm).display;\n\n            let flowDirection = 'row';\n            if (display === 'grid') {\n              const gridAutoFlow = window.getComputedStyle(childContainerElm).gridAutoFlow;\n              flowDirection = gridAutoFlow === 'row' ? 'column' : 'row';\n            } else if (display === 'flex') {\n              flowDirection = window.getComputedStyle(childContainerElm).flexDirection;\n            }\n\n            nodeSlots[slotNamePropValue] = {\n              type: slotType,\n              rect,\n              flowDirection: flowDirection as FlowDirection,\n            };\n          }\n        }\n      });\n    }\n  });\n\n  return { nodes };\n}\n\nexport default function getPageViewState(rootElm: HTMLElement): PageViewState {\n  return getNodesViewInfo(rootElm);\n}\n","import { FlowDirection } from '@mui/toolpad-core';\n\nexport interface Rectangle {\n  x: number;\n  y: number;\n  width: number;\n  height: number;\n}\n\n/**\n * Calculates the Euclidian distance between two points\n */\nexport function distanceToPoint(x1: number, y1: number, x2: number, y2: number): number {\n  return Math.sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2);\n}\n/**\n * Calculates the shortest Euclidian distance from a point to a rectangle. Returns `0` if the\n * point falss within the rectangle.\n */\nexport function distanceToRect(rect: Rectangle, x: number, y: number) {\n  const left = rect.x;\n  const top = rect.y;\n  const right = rect.x + rect.width;\n  const bottom = rect.y + rect.height;\n  if (x < left && y < top) {\n    return distanceToPoint(x, y, left, top);\n  }\n  if (x > right && y < top) {\n    return distanceToPoint(x, y, right, top);\n  }\n  if (x > right && y > bottom) {\n    return distanceToPoint(x, y, right, bottom);\n  }\n  if (x < left && y > bottom) {\n    return distanceToPoint(x, y, left, bottom);\n  }\n  if (x < left) {\n    return left - x;\n  }\n  if (x > right) {\n    return x - right;\n  }\n  if (y < top) {\n    return top - y;\n  }\n  if (y > bottom) {\n    return y - bottom;\n  }\n  return 0;\n}\n\n/**\n * Calculates the shortes Euclidian distance from a point to a line segment.\n * All credit goes to https://stackoverflow.com/a/6853926/419436\n * I was too lazy to figure out the math\n */\nexport function distanceToLine(\n  x1: number,\n  y1: number,\n  x2: number,\n  y2: number,\n  x: number,\n  y: number,\n): number {\n  const A = x - x1;\n  const B = y - y1;\n  const C = x2 - x1;\n  const D = y2 - y1;\n\n  const dot = A * C + B * D;\n  const lenSq = C * C + D * D;\n  let param = -1;\n  if (lenSq > 0) {\n    // in case of 0 length line\n    param = dot / lenSq;\n  }\n\n  let xx;\n  let yy;\n\n  if (param < 0) {\n    xx = x1;\n    yy = y1;\n  } else if (param > 1) {\n    xx = x2;\n    yy = y2;\n  } else {\n    xx = x1 + param * C;\n    yy = y1 + param * D;\n  }\n\n  const dx = x - xx;\n  const dy = y - yy;\n  return Math.sqrt(dx * dx + dy * dy);\n}\n\n/**\n * Translates a `Rectangle` into CSS properties for absolutely positioned elements.\n */\nexport function absolutePositionCss({ x, y, width, height }: Rectangle): React.CSSProperties {\n  return { left: x, top: y, width, height };\n}\n\nexport function isHorizontalFlow(flowDirection: FlowDirection): boolean {\n  return flowDirection === 'row' || flowDirection === 'row-reverse';\n}\n\nexport function isVerticalFlow(flowDirection: FlowDirection): boolean {\n  return flowDirection === 'column' || flowDirection === 'column-reverse';\n}\n\nexport function isReverseFlow(flowDirection: FlowDirection): boolean {\n  return flowDirection === 'row-reverse' || flowDirection === 'column-reverse';\n}\n\n/**\n * Returns the bounding client rect of an element relative to its container.\n */\nexport function getRelativeBoundingRect(containerElm: Element, childElm: Element): Rectangle {\n  const containerRect = containerElm.getBoundingClientRect();\n  const childRect = childElm.getBoundingClientRect();\n\n  return {\n    x: childRect.x - containerRect.x,\n    y: childRect.y - containerRect.y,\n    width: childRect.width,\n    height: childRect.height,\n  };\n}\n\n/**\n * Returns the bounding box of an element against another element.\n * Considers the box model to return the full dimensions, including padding/border/margin.\n */\nexport function getRelativeOuterRect(containerElm: Element, childElm: Element): Rectangle {\n  const { x, y, width, height } = getRelativeBoundingRect(containerElm, childElm);\n  const styles = window.getComputedStyle(childElm);\n\n  const parseMarginStyle = (style: string): number => (style === 'auto' ? 0 : parseFloat(style));\n\n  let offsetLeft = parseMarginStyle(styles.marginLeft);\n  let offsetRight = parseMarginStyle(styles.marginRight);\n  let offsetTop = parseMarginStyle(styles.marginTop);\n  let offsetBottom = parseMarginStyle(styles.marginBottom);\n\n  if (styles.boxSizing === 'content-box') {\n    offsetLeft += parseFloat(styles.paddingLeft) + parseFloat(styles.borderLeftWidth);\n    offsetRight += parseFloat(styles.paddingRight) + parseFloat(styles.borderRightWidth);\n    offsetTop += parseFloat(styles.paddingTop) + parseFloat(styles.borderTopWidth);\n    offsetBottom += parseFloat(styles.paddingBottom) + parseFloat(styles.borderBottomWidth);\n  }\n\n  return {\n    x: x - offsetLeft,\n    y: y - offsetTop,\n    width: width + offsetLeft + offsetRight,\n    height: height + offsetTop + offsetBottom,\n  };\n}\n\n/**\n * Checks whether a point falls within a reactangle\n */\nexport function rectContainsPoint(rect: Rectangle, x: number, y: number): boolean {\n  return rect.x <= x && rect.x + rect.width >= x && rect.y <= y && rect.y + rect.height >= y;\n}\n\nexport const RECTANGLE_EDGE_TOP = 'top';\nexport const RECTANGLE_EDGE_BOTTOM = 'bottom';\nexport const RECTANGLE_EDGE_LEFT = 'left';\nexport const RECTANGLE_EDGE_RIGHT = 'right';\nexport type RectangleEdge =\n  | typeof RECTANGLE_EDGE_TOP\n  | typeof RECTANGLE_EDGE_BOTTOM\n  | typeof RECTANGLE_EDGE_LEFT\n  | typeof RECTANGLE_EDGE_RIGHT;\n\nexport function getRectanglePointActiveEdge(\n  rect: Rectangle,\n  x: number,\n  y: number,\n): RectangleEdge | null {\n  const { height: rectHeight, width: rectWidth } = rect;\n\n  // Out of bounds\n  if (x < 0 || x > rectWidth || y < 0 || y > rectHeight) {\n    return null;\n  }\n\n  const isOverFirstDiagonal = y < (rectHeight / rectWidth) * x;\n  const isOverSecondDiagonal = y < -1 * (rectHeight / rectWidth) * x + rectHeight;\n\n  if (isOverFirstDiagonal && isOverSecondDiagonal) {\n    return RECTANGLE_EDGE_TOP;\n  }\n  if (isOverFirstDiagonal) {\n    return RECTANGLE_EDGE_RIGHT;\n  }\n  if (isOverSecondDiagonal) {\n    return RECTANGLE_EDGE_LEFT;\n  }\n  return RECTANGLE_EDGE_BOTTOM;\n}\n","import { Emitter } from '@mui/toolpad-utils/events';\nimport type { RuntimeEvents } from '@mui/toolpad-core';\nimport { TOOLPAD_BRIDGE_GLOBAL } from '../constants';\nimport type { AppCanvasState, PageViewState } from '../types';\n\ndeclare global {\n  interface Window {\n    [TOOLPAD_BRIDGE_GLOBAL]?: ToolpadBridge | ((bridge: ToolpadBridge) => void);\n  }\n}\n\nconst COMMAND_HANDLERS = Symbol('hidden property to hold the command handlers');\n\ntype Commands<T extends Record<string, Function>> = T & {\n  [COMMAND_HANDLERS]: Partial<T>;\n};\n\nfunction createCommands<T extends Record<string, Function>>(initial: Partial<T> = {}): Commands<T> {\n  return new Proxy(\n    {\n      [COMMAND_HANDLERS]: initial,\n    },\n    {\n      get(target, prop, receiver) {\n        if (typeof prop !== 'string') {\n          return Reflect.get(target, prop, receiver);\n        }\n\n        return (...args: any[]): any => {\n          const handler = target[COMMAND_HANDLERS][prop];\n          if (typeof handler !== 'function') {\n            throw new Error(`Command \"${prop}\" not recognized.`);\n          }\n          return handler(...args);\n        };\n      },\n    },\n  ) as Commands<T>;\n}\n\nexport function setCommandHandler<T extends Record<string, Function>, K extends keyof T & string>(\n  commands: Commands<T>,\n  name: K,\n  handler: T[K],\n) {\n  if (typeof commands[COMMAND_HANDLERS][name] !== 'undefined') {\n    throw new Error(`\"${name}\" is already handled`);\n  }\n  commands[COMMAND_HANDLERS][name] = handler;\n  return () => {\n    delete commands[COMMAND_HANDLERS][name];\n  };\n}\n\n// Interface to communicate between editor and canvas\nexport interface ToolpadBridge {\n  // Events fired in the editor, listened in the canvas\n  editorEvents: Emitter<{}>;\n  // Commands executed from the canvas, ran in the editor\n  editorCommands: Commands<{}>;\n  // Events fired in the canvas, listened in the editor\n  canvasEvents: Emitter<RuntimeEvents>;\n  // Commands executed from the editor, ran in the canvas\n  canvasCommands: Commands<{\n    update(updates: AppCanvasState): void;\n    getViewCoordinates(clientX: number, clientY: number): { x: number; y: number } | null;\n    getPageViewState(): PageViewState;\n    isReady(): boolean;\n    invalidateQueries(): void;\n  }>;\n}\n\nif (\n  typeof window !== 'undefined' &&\n  process.env.NODE_ENV !== 'test' &&\n  !(window.frameElement as HTMLIFrameElement | null)?.dataset.toolpadCanvas\n) {\n  throw new Error(\n    'An attempt was made at setting up the canvas bridge outside of the canvas. Was this file imported unintentionally?',\n  );\n}\n\nlet canvasIsReady = false;\nexport const bridge: ToolpadBridge = {\n  editorEvents: new Emitter(),\n  editorCommands: createCommands(),\n  canvasEvents: new Emitter(),\n  canvasCommands: createCommands({\n    isReady: () => canvasIsReady,\n  }),\n} as ToolpadBridge;\n\nbridge.canvasEvents.on('ready', () => {\n  canvasIsReady = true;\n});\n\nif (typeof window !== 'undefined') {\n  if (typeof window[TOOLPAD_BRIDGE_GLOBAL] === 'function') {\n    window[TOOLPAD_BRIDGE_GLOBAL](bridge);\n  }\n  window[TOOLPAD_BRIDGE_GLOBAL] = bridge;\n}\n","import * as React from 'react';\nimport type { ToolpadBridge } from './ToolpadBridge';\n\nexport const BridgeContext = React.createContext<ToolpadBridge | null>(null);\n"],"mappings":"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","names":["React"]}