{"version":3,"file":"context-helpers.cjs","names":[],"sources":["../../src/lib/context-helpers.ts"],"sourcesContent":["import type { Anchor, ContextState, Position, Size } from \"./types\";\n\nexport function updateSizeFromElement(\n  state: ContextState,\n  element: HTMLElement,\n  fallback: Size,\n): void {\n  const rect = element.getBoundingClientRect();\n  state.size = {\n    width: rect.width || fallback.width,\n    height: rect.height || fallback.height,\n  };\n}\n\nexport function clampSize(\n  size: Size,\n  viewport: Size,\n  edgeMargin: number,\n  minWidth: number,\n  minHeight: number,\n): Size {\n  const maxWidth = Math.max(minWidth, viewport.width - edgeMargin * 2);\n  const maxHeight = Math.max(minHeight, viewport.height - edgeMargin * 2);\n\n  return {\n    width: clamp(size.width, minWidth, maxWidth),\n    height: clamp(size.height, minHeight, maxHeight),\n  };\n}\n\nexport function constrainToViewport(\n  state: ContextState,\n  position: Position,\n  viewport: Size,\n  edgeMargin: number,\n): Position {\n  const maxX = Math.max(\n    edgeMargin,\n    viewport.width - state.size.width - edgeMargin,\n  );\n  const maxY = Math.max(\n    edgeMargin,\n    viewport.height - state.size.height - edgeMargin,\n  );\n\n  return {\n    x: clamp(position.x, edgeMargin, maxX),\n    y: clamp(position.y, edgeMargin, maxY),\n  };\n}\n\nexport function keepPositionWithinViewport(\n  state: ContextState,\n  viewport: Size,\n  edgeMargin: number,\n): void {\n  state.position = constrainToViewport(\n    state,\n    state.position,\n    viewport,\n    edgeMargin,\n  );\n}\n\nexport function centerContext(\n  state: ContextState,\n  viewport: Size,\n  edgeMargin: number,\n): Position {\n  const centered: Position = {\n    x: Math.round((viewport.width - state.size.width) / 2),\n    y: Math.round((viewport.height - state.size.height) / 2),\n  };\n\n  state.position = constrainToViewport(state, centered, viewport, edgeMargin);\n  updateAnchorFromPosition(state, viewport, edgeMargin);\n  return state.position;\n}\n\nexport function updateAnchorFromPosition(\n  state: ContextState,\n  viewport: Size,\n  edgeMargin: number,\n): void {\n  const centerX = state.position.x + state.size.width / 2;\n  const centerY = state.position.y + state.size.height / 2;\n\n  const horizontal: Anchor[\"horizontal\"] =\n    centerX < viewport.width / 2 ? \"left\" : \"right\";\n  const vertical: Anchor[\"vertical\"] =\n    centerY < viewport.height / 2 ? \"top\" : \"bottom\";\n\n  state.anchor = { horizontal, vertical };\n\n  const maxHorizontalOffset = Math.max(\n    edgeMargin,\n    viewport.width - state.size.width - edgeMargin,\n  );\n  const maxVerticalOffset = Math.max(\n    edgeMargin,\n    viewport.height - state.size.height - edgeMargin,\n  );\n\n  state.anchorOffset = {\n    x:\n      horizontal === \"left\"\n        ? clamp(state.position.x, edgeMargin, maxHorizontalOffset)\n        : clamp(\n            viewport.width - state.position.x - state.size.width,\n            edgeMargin,\n            maxHorizontalOffset,\n          ),\n    y:\n      vertical === \"top\"\n        ? clamp(state.position.y, edgeMargin, maxVerticalOffset)\n        : clamp(\n            viewport.height - state.position.y - state.size.height,\n            edgeMargin,\n            maxVerticalOffset,\n          ),\n  };\n}\n\nexport function applyAnchorPosition(\n  state: ContextState,\n  viewport: Size,\n  edgeMargin: number,\n): Position {\n  const maxHorizontalOffset = Math.max(\n    edgeMargin,\n    viewport.width - state.size.width - edgeMargin,\n  );\n  const maxVerticalOffset = Math.max(\n    edgeMargin,\n    viewport.height - state.size.height - edgeMargin,\n  );\n\n  const horizontalOffset = clamp(\n    state.anchorOffset.x,\n    edgeMargin,\n    maxHorizontalOffset,\n  );\n  const verticalOffset = clamp(\n    state.anchorOffset.y,\n    edgeMargin,\n    maxVerticalOffset,\n  );\n\n  const x =\n    state.anchor.horizontal === \"left\"\n      ? horizontalOffset\n      : viewport.width - state.size.width - horizontalOffset;\n\n  const y =\n    state.anchor.vertical === \"top\"\n      ? verticalOffset\n      : viewport.height - state.size.height - verticalOffset;\n\n  state.anchorOffset = { x: horizontalOffset, y: verticalOffset };\n  state.position = constrainToViewport(state, { x, y }, viewport, edgeMargin);\n  return state.position;\n}\n\nfunction clamp(value: number, min: number, max: number): number {\n  return Math.min(Math.max(min, value), max);\n}\n"],"mappings":"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"}