Common

useDropdownPosition

Composable interno per posizionamento dropdown con position:fixed, flip verticale e scroll tracking.

Composable interno — utilizzato da tutti i componenti dropdown della libreria.

Firma TypeScript

export function useDropdownPosition(
  triggerRef?: Ref<HTMLElement | null>,
  options?: UseDropdownPositionOptions
): UseDropdownPositionResult

export interface UseDropdownPositionOptions {
  gap?: number;               // default: 4px
  autoTrack?: boolean;        // default: false
  dropdownHeight?: number;    // default: 250px (per calcolo flip)
  dropdownWidth?: number;     // opzionale
  zIndex?: number;            // default: 50
  viewportMargin?: number;    // default: 8px
  containHorizontal?: boolean; // default: true
  matchTriggerWidth?: boolean; // default: true
}

export interface UseDropdownPositionResult {
  position: Ref<DropdownPosition>;    // { top, left, width, zIndex } con 'px'
  positionRaw: Ref<DropdownPositionRaw>; // valori numerici
  openUp: Ref<boolean>;
  updatePosition: () => void;
  setTarget: (element: HTMLElement | null) => void;
  startTracking: () => void;
  stopTracking: () => void;
  isTracking: Ref<boolean>;
}

Parametri

ParametroTipoDescrizione
triggerRefRef<HTMLElement | null> (opzionale)Elemento trigger fisso
options.gapnumberSpazio tra trigger e dropdown in px (default: 4)
options.dropdownHeightnumberAltezza stimata per calcolo flip (default: 250)
options.matchTriggerWidthbooleanAdatta la larghezza al trigger (default: true)
options.containHorizontalbooleanEvita overflow orizzontale (default: true)

Valore di Ritorno

ProprietàTipoDescrizione
positionRef<DropdownPosition>Posizione con stringhe 'Xpx' da bindare a :style
openUpRef<boolean>True se il dropdown si apre verso l'alto
updatePosition() => voidRicalcola la posizione manualmente
setTarget(el: HTMLElement | null) => voidImposta target dinamico (per Menu popup)
startTracking() => voidAttiva scroll/resize tracking
stopTracking() => voidDisattiva scroll/resize tracking
isTrackingRef<boolean>True se il tracking e attivo

Esempio

const triggerRef = ref<HTMLElement | null>(null)
const { position, openUp, updatePosition, startTracking, stopTracking } =
  useDropdownPosition(triggerRef, { gap: 4, dropdownHeight: 300 })

// Aggiorna la posizione all'apertura del dropdown
onOpen: () => {
  updatePosition()
  startTracking()
}

// Pulisci alla chiusura
onClose: () => {
  stopTracking()
}
<div :style="position" class="dropdown-panel">...</div>

Note

  • Usa position: fixed — non dipende dalla posizione di scroll del container.
  • Il flip verticale avviene automaticamente se non c'e spazio sotto il trigger (compara spazio sopra/sotto).
  • setTarget permette l'uso con target dinamico (es. Menu che si apre su un pulsante diverso ogni volta).
  • Il tracking scroll usa capture phase (true) per intercettare scroll in contenitori scrollabili interni.
  • Cleanup tracking in onBeforeUnmount automatico.