UNPKG

vuestic-ui

Version:
1 lines 5.29 kB
{"version":3,"file":"useDropdown.mjs","sources":["../../../../../../src/components/va-dropdown/hooks/useDropdown.ts"],"sourcesContent":["import { computed, ref, Ref } from 'vue'\nimport {\n autoUpdate,\n flip,\n offset, Placement,\n shift,\n size,\n useFloating,\n} from '@floating-ui/vue'\nimport { CursorAnchor, DropdownOffsetProp } from '../types'\nimport { PlacementWithAlias, usePlacementAliases } from '../../../composables'\n\ntype useDropdownOptions = {\n placement: PlacementWithAlias,\n offset: DropdownOffsetProp,\n autoPlacement: boolean,\n stickToEdges: boolean,\n keepAnchorWidth: boolean,\n verticalScrollOnOverflow: boolean,\n}\n\nexport const useDropdown = (\n anchorComputed: Ref<HTMLElement| CursorAnchor | undefined>,\n floating: Ref<HTMLElement | undefined>,\n target: Ref<HTMLElement | undefined>,\n options: Ref<useDropdownOptions>,\n) => {\n const placementComputed = computed(() => {\n const { position, align } = usePlacementAliases({ placement: options.value.placement })\n\n return `${position.value}-${align.value}` as Placement\n })\n\n const offsetComputed = computed(() => {\n const dropdownOffset = options.value.offset\n const result = { mainAxis: 0, crossAxis: 0 }\n if (Array.isArray(dropdownOffset)) {\n result.mainAxis = dropdownOffset[0]\n result.crossAxis = dropdownOffset[1]\n }\n\n if (typeof dropdownOffset === 'number') {\n result.mainAxis = dropdownOffset\n }\n\n return result\n })\n\n const middlewareComputed = computed(() => {\n const { autoPlacement, stickToEdges, keepAnchorWidth, verticalScrollOnOverflow } = options.value\n const result = [\n offset(offsetComputed.value),\n ]\n\n if (autoPlacement) {\n result.push(\n // boundary doesn't work with ssr (trying to access document)\n flip({\n boundary: target.value,\n }),\n )\n }\n\n if (stickToEdges) {\n result.push(\n shift(),\n )\n }\n\n if (keepAnchorWidth || verticalScrollOnOverflow) {\n result.push(size({\n apply ({ elements, availableHeight }) {\n if (keepAnchorWidth) {\n const reference = elements.reference\n const availableWidth = reference.getBoundingClientRect().width\n Object.assign(elements.floating.style, {\n // Don't set width here, because some plugin applies width 100% and it breaks layout\n maxWidth: `${availableWidth}px`,\n minWidth: `${availableWidth}px`,\n })\n }\n\n if (verticalScrollOnOverflow) {\n Object.assign(elements.floating.style, {\n maxHeight: `${availableHeight}px`,\n })\n }\n },\n }))\n }\n\n return result\n })\n\n const { floatingStyles, isPositioned } = typeof document === 'undefined'\n ? { floatingStyles: {}, isPositioned: ref(false) }\n : useFloating(anchorComputed, floating, {\n placement: placementComputed,\n whileElementsMounted: autoUpdate,\n middleware: middlewareComputed,\n transform: true,\n })\n\n return {\n // Because floating ui by default set top and left to 0 before position calculated, dropdown jumps to the left top corner\n // If user wants to make focus on el as soon as Dropdown is opened, page will be scrolled on the left top corner\n floatingStyles: computed(() => {\n // If position is not calculated yet, we need to set position to fixed to prevent page scrolling\n if (!isPositioned.value) {\n return {\n position: 'fixed',\n }\n }\n\n return floatingStyles.value\n }),\n\n isPositioned,\n }\n}\n"],"names":[],"mappings":";;;AAqBO,MAAM,cAAc,CACzB,gBACA,UACA,QACA,YACG;AACG,QAAA,oBAAoB,SAAS,MAAM;AACjC,UAAA,EAAE,UAAU,MAAA,IAAU,oBAAoB,EAAE,WAAW,QAAQ,MAAM,UAAA,CAAW;AAEtF,WAAO,GAAG,SAAS,KAAK,IAAI,MAAM,KAAK;AAAA,EAAA,CACxC;AAEK,QAAA,iBAAiB,SAAS,MAAM;AAC9B,UAAA,iBAAiB,QAAQ,MAAM;AACrC,UAAM,SAAS,EAAE,UAAU,GAAG,WAAW,EAAE;AACvC,QAAA,MAAM,QAAQ,cAAc,GAAG;AAC1B,aAAA,WAAW,eAAe,CAAC;AAC3B,aAAA,YAAY,eAAe,CAAC;AAAA,IACrC;AAEI,QAAA,OAAO,mBAAmB,UAAU;AACtC,aAAO,WAAW;AAAA,IACpB;AAEO,WAAA;AAAA,EAAA,CACR;AAEK,QAAA,qBAAqB,SAAS,MAAM;AACxC,UAAM,EAAE,eAAe,cAAc,iBAAiB,6BAA6B,QAAQ;AAC3F,UAAM,SAAS;AAAA,MACb,OAAO,eAAe,KAAK;AAAA,IAAA;AAG7B,QAAI,eAAe;AACV,aAAA;AAAA;AAAA,QAEL,KAAK;AAAA,UACH,UAAU,OAAO;AAAA,QAAA,CAClB;AAAA,MAAA;AAAA,IAEL;AAEA,QAAI,cAAc;AACT,aAAA;AAAA,QACL,MAAM;AAAA,MAAA;AAAA,IAEV;AAEA,QAAI,mBAAmB,0BAA0B;AAC/C,aAAO,KAAK,KAAK;AAAA,QACf,MAAO,EAAE,UAAU,mBAAmB;AACpC,cAAI,iBAAiB;AACnB,kBAAM,YAAY,SAAS;AACrB,kBAAA,iBAAiB,UAAU,sBAAA,EAAwB;AAClD,mBAAA,OAAO,SAAS,SAAS,OAAO;AAAA;AAAA,cAErC,UAAU,GAAG,cAAc;AAAA,cAC3B,UAAU,GAAG,cAAc;AAAA,YAAA,CAC5B;AAAA,UACH;AAEA,cAAI,0BAA0B;AACrB,mBAAA,OAAO,SAAS,SAAS,OAAO;AAAA,cACrC,WAAW,GAAG,eAAe;AAAA,YAAA,CAC9B;AAAA,UACH;AAAA,QACF;AAAA,MACD,CAAA,CAAC;AAAA,IACJ;AAEO,WAAA;AAAA,EAAA,CACR;AAED,QAAM,EAAE,gBAAgB,aAAA,IAAiB,OAAO,aAAa,cACzD,EAAE,gBAAgB,CAAC,GAAG,cAAc,IAAI,KAAK,EAC7C,IAAA,YAAY,gBAAgB,UAAU;AAAA,IACtC,WAAW;AAAA,IACX,sBAAsB;AAAA,IACtB,YAAY;AAAA,IACZ,WAAW;AAAA,EAAA,CACZ;AAEI,SAAA;AAAA;AAAA;AAAA,IAGL,gBAAgB,SAAS,MAAM;AAEzB,UAAA,CAAC,aAAa,OAAO;AAChB,eAAA;AAAA,UACL,UAAU;AAAA,QAAA;AAAA,MAEd;AAEA,aAAO,eAAe;AAAA,IAAA,CACvB;AAAA,IAED;AAAA,EAAA;AAEJ;"}