92 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			92 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
import { unref, ref, onMounted, watchEffect, isRef } from 'vue';
 | 
						|
import { isClient, unrefElement } from '@vueuse/core';
 | 
						|
import { isNil } from 'lodash-unified';
 | 
						|
import { arrow, computePosition } from '@floating-ui/dom';
 | 
						|
import { keysOf } from '../../utils/objects.mjs';
 | 
						|
import { buildProps } from '../../utils/vue/props/runtime.mjs';
 | 
						|
 | 
						|
const useFloatingProps = buildProps({});
 | 
						|
const unrefReference = (elRef) => {
 | 
						|
  if (!isClient)
 | 
						|
    return;
 | 
						|
  if (!elRef)
 | 
						|
    return elRef;
 | 
						|
  const unrefEl = unrefElement(elRef);
 | 
						|
  if (unrefEl)
 | 
						|
    return unrefEl;
 | 
						|
  return isRef(elRef) ? unrefEl : elRef;
 | 
						|
};
 | 
						|
const getPositionDataWithUnit = (record, key) => {
 | 
						|
  const value = record == null ? void 0 : record[key];
 | 
						|
  return isNil(value) ? "" : `${value}px`;
 | 
						|
};
 | 
						|
const useFloating = ({
 | 
						|
  middleware,
 | 
						|
  placement,
 | 
						|
  strategy
 | 
						|
}) => {
 | 
						|
  const referenceRef = ref();
 | 
						|
  const contentRef = ref();
 | 
						|
  const x = ref();
 | 
						|
  const y = ref();
 | 
						|
  const middlewareData = ref({});
 | 
						|
  const states = {
 | 
						|
    x,
 | 
						|
    y,
 | 
						|
    placement,
 | 
						|
    strategy,
 | 
						|
    middlewareData
 | 
						|
  };
 | 
						|
  const update = async () => {
 | 
						|
    if (!isClient)
 | 
						|
      return;
 | 
						|
    const referenceEl = unrefReference(referenceRef);
 | 
						|
    const contentEl = unrefElement(contentRef);
 | 
						|
    if (!referenceEl || !contentEl)
 | 
						|
      return;
 | 
						|
    const data = await computePosition(referenceEl, contentEl, {
 | 
						|
      placement: unref(placement),
 | 
						|
      strategy: unref(strategy),
 | 
						|
      middleware: unref(middleware)
 | 
						|
    });
 | 
						|
    keysOf(states).forEach((key) => {
 | 
						|
      states[key].value = data[key];
 | 
						|
    });
 | 
						|
  };
 | 
						|
  onMounted(() => {
 | 
						|
    watchEffect(() => {
 | 
						|
      update();
 | 
						|
    });
 | 
						|
  });
 | 
						|
  return {
 | 
						|
    ...states,
 | 
						|
    update,
 | 
						|
    referenceRef,
 | 
						|
    contentRef
 | 
						|
  };
 | 
						|
};
 | 
						|
const arrowMiddleware = ({
 | 
						|
  arrowRef,
 | 
						|
  padding
 | 
						|
}) => {
 | 
						|
  return {
 | 
						|
    name: "arrow",
 | 
						|
    options: {
 | 
						|
      element: arrowRef,
 | 
						|
      padding
 | 
						|
    },
 | 
						|
    fn(args) {
 | 
						|
      const arrowEl = unref(arrowRef);
 | 
						|
      if (!arrowEl)
 | 
						|
        return {};
 | 
						|
      return arrow({
 | 
						|
        element: arrowEl,
 | 
						|
        padding
 | 
						|
      }).fn(args);
 | 
						|
    }
 | 
						|
  };
 | 
						|
};
 | 
						|
 | 
						|
export { arrowMiddleware, getPositionDataWithUnit, useFloating, useFloatingProps };
 | 
						|
//# sourceMappingURL=index.mjs.map
 |