Skip to content

useBreakpoint

Composable pour la detection reactive des breakpoints. Utilise window.matchMedia pour une detection performante sans ecouter l'evenement resize. Compatible SSR.

Utilisation basique

vue
<script setup>
import { useBreakpoint } from '@surgeui/ds-vue'

const { current, isUp, isDown, isBetween, matches } = useBreakpoint()
</script>

<template>
  <div>
    <p>Breakpoint actif : {{ current }}</p>
    <p>Desktop : {{ isUp('lg') }}</p>
    <p>Mobile : {{ isDown('md') }}</p>
  </div>
</template>

Breakpoints par defaut

BreakpointLargeur minDescription
xs< 640pxMobile portrait
sm640pxMobile paysage
md768pxTablette
lg1024pxDesktop
xl1280pxGrand ecran
2xl1536pxTres grand ecran

Exemples

Affichage conditionnel

vue
<script setup>
import { useBreakpoint } from '@surgeui/ds-vue'

const { isUp, isDown } = useBreakpoint()
</script>

<template>
  <!-- Menu desktop -->
  <nav v-if="isUp('lg')">
    <a href="/">Accueil</a>
    <a href="/docs">Docs</a>
  </nav>

  <!-- Menu hamburger mobile -->
  <button v-if="isDown('lg')">
    Menu
  </button>
</template>

Grille responsive

vue
<script setup>
import { computed } from 'vue'
import { useBreakpoint } from '@surgeui/ds-vue'

const { current } = useBreakpoint()

const columns = computed(() => {
  switch (current.value) {
    case '2xl':
    case 'xl': return 4
    case 'lg': return 3
    case 'md': return 2
    default: return 1
  }
})
</script>

Plage de breakpoints

vue
<script setup>
import { useBreakpoint } from '@surgeui/ds-vue'

const { isBetween } = useBreakpoint()

// true si >= 640px et < 1024px (tablette)
const isTablet = isBetween('sm', 'lg')
</script>

Breakpoints personnalises

vue
<script setup>
import { useBreakpoint } from '@surgeui/ds-vue'

const { current, matches } = useBreakpoint({
  breakpoints: {
    sm: 480,
    md: 768,
    lg: 1200,
    xl: 1440,
    '2xl': 1920,
  }
})
</script>

API

Options

OptionTypeDefautDescription
breakpointsBreakpointConfigVoir ci-dessusSurcharge des seuils

Retour

ProprieteTypeDescription
currentComputedRef<BreakpointKey | 'xs'>Breakpoint actif le plus large
widthReadonly<Ref<number>>Largeur du viewport en pixels
matchesReadonly<Ref<BreakpointMatches>>Objet reactif { sm: bool, md: bool, ... }
isUp(bp)(bp: BreakpointKey) => booleantrue si largeur >= breakpoint
isDown(bp)(bp: BreakpointKey) => booleantrue si largeur < breakpoint
isBetween(min, max)(min, max) => booleantrue si >= min et < max
breakpointsReadonly<Ref<BreakpointConfig>>Configuration utilisee

Types

typescript
type BreakpointKey = 'sm' | 'md' | 'lg' | 'xl' | '2xl'

interface BreakpointConfig {
  sm?: number
  md?: number
  lg?: number
  xl?: number
  '2xl'?: number
}

interface BreakpointMatches {
  sm: boolean
  md: boolean
  lg: boolean
  xl: boolean
  '2xl': boolean
}

Performance

  • Utilise matchMedia au lieu d'ecouter resize — pas de debounce necessaire
  • Chaque breakpoint a son propre MediaQueryList listener
  • ResizeObserver sur documentElement pour la largeur exacte
  • Nettoyage automatique via onUnmounted

Publié sous licence MIT.