1 line
6.5 KiB
Plaintext
1 line
6.5 KiB
Plaintext
{"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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"} |