{"version":3,"sources":["../src/hooks/usePositioning/utils/computePosition.ts"],"sourcesContent":["import type { Position, PositioningShorthandValue } from '@fluentui/react-positioning';\nimport type { LogicalAlignment } from '../types';\nimport { ALIGNMENTS, POSITIONS } from '../constants';\nimport { getPlacementString } from './placement';\n\nconst DEFAULT_TOLERANCE = 2;\n\nconst closeTo = (a: number, b: number, tolerance: number): boolean => Math.abs(a - b) <= tolerance;\n\nfunction detectPosition(floatingRect: DOMRect, referenceRect: DOMRect, tolerance: number): Position | null {\n  if (floatingRect.bottom <= referenceRect.top + tolerance) {\n    return POSITIONS.above;\n  }\n\n  if (floatingRect.top >= referenceRect.bottom - tolerance) {\n    return POSITIONS.below;\n  }\n\n  if (floatingRect.right <= referenceRect.left + tolerance) {\n    return POSITIONS.before;\n  }\n\n  if (floatingRect.left >= referenceRect.right - tolerance) {\n    return POSITIONS.after;\n  }\n\n  return null;\n}\n\nfunction detectAlign(\n  position: Position,\n  floatingRect: DOMRect,\n  referenceRect: DOMRect,\n  tolerance: number,\n): LogicalAlignment {\n  const isBlockMain = position === POSITIONS.above || position === POSITIONS.below;\n\n  const startAligned = isBlockMain\n    ? closeTo(floatingRect.left, referenceRect.left, tolerance)\n    : closeTo(floatingRect.top, referenceRect.top, tolerance);\n\n  if (startAligned) {\n    return ALIGNMENTS.start;\n  }\n\n  const endAligned = isBlockMain\n    ? closeTo(floatingRect.right, referenceRect.right, tolerance)\n    : closeTo(floatingRect.bottom, referenceRect.bottom, tolerance);\n\n  if (endAligned) {\n    return ALIGNMENTS.end;\n  }\n\n  return ALIGNMENTS.center;\n}\n\nexport interface ComputePositionConfig {\n  tolerance?: number;\n}\n\nexport interface ComputePositionReturn {\n  position: Position;\n  align: LogicalAlignment;\n  placement: PositioningShorthandValue;\n}\n\nexport function computePosition(\n  reference: HTMLElement,\n  floating: HTMLElement,\n  config?: ComputePositionConfig,\n): ComputePositionReturn | null {\n  const tolerance = config?.tolerance ?? DEFAULT_TOLERANCE;\n  const referenceRect = reference.getBoundingClientRect();\n  const floatingRect = floating.getBoundingClientRect();\n\n  const position = detectPosition(floatingRect, referenceRect, tolerance);\n  if (!position) {\n    return null;\n  }\n\n  const align = detectAlign(position, floatingRect, referenceRect, tolerance);\n  const placement = getPlacementString(position, align);\n\n  return { position, align, placement };\n}\n"],"names":["computePosition","DEFAULT_TOLERANCE","closeTo","a","b","tolerance","Math","abs","detectPosition","floatingRect","referenceRect","bottom","top","POSITIONS","above","below","right","left","before","after","detectAlign","position","isBlockMain","startAligned","ALIGNMENTS","start","endAligned","end","center","reference","floating","config","getBoundingClientRect","align","placement","getPlacementString"],"mappings":";;;;+BAkEgBA;;;eAAAA;;;2BAhEsB;2BACH;AAEnC,MAAMC,oBAAoB;AAE1B,MAAMC,UAAU,CAACC,GAAWC,GAAWC,YAA+BC,KAAKC,GAAG,CAACJ,IAAIC,MAAMC;AAEzF,SAASG,eAAeC,YAAqB,EAAEC,aAAsB,EAAEL,SAAiB;IACtF,IAAII,aAAaE,MAAM,IAAID,cAAcE,GAAG,GAAGP,WAAW;QACxD,OAAOQ,oBAAS,CAACC,KAAK;IACxB;IAEA,IAAIL,aAAaG,GAAG,IAAIF,cAAcC,MAAM,GAAGN,WAAW;QACxD,OAAOQ,oBAAS,CAACE,KAAK;IACxB;IAEA,IAAIN,aAAaO,KAAK,IAAIN,cAAcO,IAAI,GAAGZ,WAAW;QACxD,OAAOQ,oBAAS,CAACK,MAAM;IACzB;IAEA,IAAIT,aAAaQ,IAAI,IAAIP,cAAcM,KAAK,GAAGX,WAAW;QACxD,OAAOQ,oBAAS,CAACM,KAAK;IACxB;IAEA,OAAO;AACT;AAEA,SAASC,YACPC,QAAkB,EAClBZ,YAAqB,EACrBC,aAAsB,EACtBL,SAAiB;IAEjB,MAAMiB,cAAcD,aAAaR,oBAAS,CAACC,KAAK,IAAIO,aAAaR,oBAAS,CAACE,KAAK;IAEhF,MAAMQ,eAAeD,cACjBpB,QAAQO,aAAaQ,IAAI,EAAEP,cAAcO,IAAI,EAAEZ,aAC/CH,QAAQO,aAAaG,GAAG,EAAEF,cAAcE,GAAG,EAAEP;IAEjD,IAAIkB,cAAc;QAChB,OAAOC,qBAAU,CAACC,KAAK;IACzB;IAEA,MAAMC,aAAaJ,cACfpB,QAAQO,aAAaO,KAAK,EAAEN,cAAcM,KAAK,EAAEX,aACjDH,QAAQO,aAAaE,MAAM,EAAED,cAAcC,MAAM,EAAEN;IAEvD,IAAIqB,YAAY;QACd,OAAOF,qBAAU,CAACG,GAAG;IACvB;IAEA,OAAOH,qBAAU,CAACI,MAAM;AAC1B;AAYO,SAAS5B,gBACd6B,SAAsB,EACtBC,QAAqB,EACrBC,MAA8B;IAE9B,MAAM1B,YAAY0B,QAAQ1B,aAAaJ;IACvC,MAAMS,gBAAgBmB,UAAUG,qBAAqB;IACrD,MAAMvB,eAAeqB,SAASE,qBAAqB;IAEnD,MAAMX,WAAWb,eAAeC,cAAcC,eAAeL;IAC7D,IAAI,CAACgB,UAAU;QACb,OAAO;IACT;IAEA,MAAMY,QAAQb,YAAYC,UAAUZ,cAAcC,eAAeL;IACjE,MAAM6B,YAAYC,IAAAA,6BAAkB,EAACd,UAAUY;IAE/C,OAAO;QAAEZ;QAAUY;QAAOC;IAAU;AACtC"}