Raccourci clavier : Ctrl + K
Commencer

Carte de survol

VHoverCard donne un aperçu de la destination d’un lien, comme le profil derrière une mention, quand le pointeur ou le focus clavier s’y attarde. Son contenu peut être interactif.

Utilisation

vue
<script setup lang="ts">
import { VAvatar, VButton, VHoverCard, VLink, VTypography } from 'vectis-ui'
</script>

<template>
  <VHoverCard>
    <template #default="{ triggerProps }">
      <VLink href="#ada" v-bind="triggerProps">@ada</VLink>
    </template>
    <template #content>
      <div class="header">
        <VAvatar name="Ada Lovelace" size="lg" />
        <div>
          <VTypography variant="subtitle">Ada Lovelace</VTypography>
          <VTypography variant="body-sm" tone="muted">@ada</VTypography>
        </div>
      </div>
      <VTypography variant="body-sm">
        Mathematician. Wrote the first published algorithm for the Analytical Engine.
      </VTypography>
      <div class="actions">
        <VButton size="sm">Follow</VButton>
      </div>
    </template>
  </VHoverCard>
</template>

<style scoped>
.header {
  display: flex;
  align-items: center;
  gap: var(--vectis-space-3);
}
.actions {
  display: flex;
  gap: var(--vectis-space-2);
}
</style>

Exemples

Dans le texte

Le déclencheur suit le fil de la phrase. Le contenu de la carte est monté à la première ouverture : un déclencheur dans un paragraphe produit donc un HTML valide côté serveur.

vue

The notes were translated and expanded by Ada Lovelace in 1843.

<script setup lang="ts">
import { VAvatar, VHoverCard, VLink, VTypography } from 'vectis-ui'
</script>

<template>
  <VTypography class="sentence">
    The notes were translated and expanded by
    <VHoverCard>
      <template #default="{ triggerProps }">
        <VLink href="#ada" v-bind="triggerProps">Ada Lovelace</VLink>
      </template>
      <template #content>
        <div class="header">
          <VAvatar name="Ada Lovelace" />
          <VTypography variant="subtitle">Ada Lovelace</VTypography>
        </div>
        <VTypography variant="body-sm">
          English mathematician, born in 1815. Her Note G is often cited as the first computer
          program.
        </VTypography>
      </template>
    </VHoverCard>
    in 1843.
  </VTypography>
</template>

<style scoped>
.sentence {
  max-inline-size: 32rem;
}
.header {
  display: flex;
  align-items: center;
  gap: var(--vectis-space-3);
}
</style>

Délais

openDelay fixe la durée de survol ou de focus avant l’ouverture. closeDelay garde la carte le temps que le pointeur franchisse l’écart qui l’en sépare.

vue
<script setup lang="ts">
import { VHoverCard, VLink, VTypography } from 'vectis-ui'

const cards = [
  { label: 'Default (500 / 300 ms)', openDelay: 500, closeDelay: 300 },
  { label: 'Quick (150 / 100 ms)', openDelay: 150, closeDelay: 100 },
]
</script>

<template>
  <div class="row">
    <VHoverCard
      v-for="card in cards"
      :key="card.label"
      :open-delay="card.openDelay"
      :close-delay="card.closeDelay"
    >
      <template #default="{ triggerProps }">
        <VLink href="#vectis" v-bind="triggerProps">{{ card.label }}</VLink>
      </template>
      <template #content>
        <VTypography variant="subtitle">vectis-ui</VTypography>
        <VTypography variant="body-sm" tone="muted">
          A Vue 3 component library built for modern browsers.
        </VTypography>
      </template>
    </VHoverCard>
  </div>
</template>

<style scoped>
.row {
  display: flex;
  flex-wrap: wrap;
  gap: var(--vectis-space-6);
}
</style>

Contenu interactif

Le focus clavier ouvre la carte après le délai et Tab y entre. Échap la ferme depuis n’importe où et rend le focus au déclencheur. Un tap n’ouvre rien : gardez la même information à la destination du déclencheur.

vue
<script setup lang="ts">
import { VHoverCard, VLink, VTypography } from 'vectis-ui'
</script>

<template>
  <VHoverCard placement="bottom-start">
    <template #default="{ triggerProps }">
      <VLink href="#repository" v-bind="triggerProps">vectis-ui/vectis-ui</VLink>
    </template>
    <template #content>
      <VTypography variant="subtitle">vectis-ui/vectis-ui</VTypography>
      <VTypography variant="body-sm" tone="muted">
        A Vue 3 component library built for modern browsers.
      </VTypography>
      <nav aria-label="Repository" class="links">
        <VLink href="#issues" underline="hover">Issues</VLink>
        <VLink href="#pulls" underline="hover">Pull requests</VLink>
        <VLink href="#releases" underline="hover">Releases</VLink>
      </nav>
    </template>
  </VHoverCard>
</template>

<style scoped>
.links {
  display: flex;
  flex-wrap: wrap;
  gap: var(--vectis-space-4);
}
</style>

Chargement à l’ouverture

v-model:open signale chaque ouverture, le bon moment pour charger les données de la carte. Le modifier ouvre ou ferme la carte sans délai.

vue
<script setup lang="ts">
import { ref } from 'vue'
import { VAvatar, VHoverCard, VLink, VSkeletonLoader, VTypography } from 'vectis-ui'

const open = ref(false)
const profile = ref<{ name: string; bio: string } | null>(null)

async function onOpen(value: boolean) {
  if (!value || profile.value) return
  // Stands in for a request to your API.
  await new Promise((resolve) => setTimeout(resolve, 800))
  profile.value = {
    name: 'Grace Hopper',
    bio: 'Computer scientist. Led the team behind the first compiler for a programming language.',
  }
}
</script>

<template>
  <VHoverCard v-model:open="open" @update:open="onOpen">
    <template #default="{ triggerProps }">
      <VLink href="#grace" v-bind="triggerProps">@grace</VLink>
    </template>
    <template #content>
      <div v-if="!profile" class="loading">
        <VSkeletonLoader shape="circle" size="lg" />
        <VSkeletonLoader :lines="2" />
      </div>
      <template v-else>
        <div class="header">
          <VAvatar :name="profile.name" size="lg" />
          <VTypography variant="subtitle">{{ profile.name }}</VTypography>
        </div>
        <VTypography variant="body-sm">{{ profile.bio }}</VTypography>
      </template>
    </template>
  </VHoverCard>
</template>

<style scoped>
.loading {
  display: grid;
  gap: var(--vectis-space-2);
  inline-size: 16rem;
}
.header {
  display: flex;
  align-items: center;
  gap: var(--vectis-space-3);
}
</style>

API

Props

PropTypeDéfaut
placementHoverCardPlacement'top' | 'top-start' | 'top-end' | 'bottom' | 'bottom-start' | 'bottom-end' | 'left' | 'left-start' | 'left-end' | 'right' | 'right-start' | 'right-end''bottom'
Position souhaitée ; bascule si l’espace manque.
openDelaynumber500
Attente au survol ou au focus clavier avant l’ouverture, en millisecondes.
closeDelaynumber300
Attente avant la fermeture une fois que le pointeur a quitté le déclencheur et la carte, en millisecondes.
v-model:openbooleanfalse
État d’ouverture. Les changements s’appliquent sans délai.

Slots

SlotType
default{ triggerProps: HoverCardTriggerProps; }
Déclencheur, généralement un lien. Liez les triggerProps fournies pour poser aria-details.
content{}
Contenu de la carte, monté à la première ouverture. Peut contenir des liens et des boutons.

Types

Types utilisés dans les tables d’API. Importez les types exportés depuis vectis-ui.

export type HoverCardTriggerProps = {
  'aria-details': string
}

Variables CSS

TokenValeur
--vectis-control-size-hover-card-max20rem