Raccourci clavier : Ctrl + K
Commencer

Raccourcis clavier

Un raccourci clavier, affiché. Il se rend en <kbd> imbriqués, écrit ses glyphes selon la plateforme, et peut écouter la combinaison qu'il montre si vous le lui demandez.

Utilisation

vue
Raccourci clavier : Ctrl + K
<script setup lang="ts">
import { VHotkeys } from 'vectis-ui'
</script>

<template>
  <VHotkeys keys="mod+k" />
</template>

Exemples

Ce qu'on peut écrire

keys est une simple chaîne, séparée par des +, où ni la casse ni les espaces ne comptent. mod est le modificateur qui appartient au système, Command sur un Mac et Ctrl partout ailleurs, là où meta nomme cette touche physique au sens littéral. Un jeton que le design system ne connaît pas est dessiné exactement tel qu'il a été écrit, et la touche + s'écrit plus.

Vous écrivezmacOSWindows et Linux
modRaccourci clavier : CommandeRaccourci clavier : Ctrl
metacmdcommandwinsuperRaccourci clavier : CommandeRaccourci clavier : Win
ctrlcontrolRaccourci clavier : CtrlRaccourci clavier : Ctrl
altoptionoptRaccourci clavier : AltRaccourci clavier : Alt
shiftRaccourci clavier : MajRaccourci clavier : Maj
enterreturnRaccourci clavier : EntréeRaccourci clavier : Entrée
escescapeRaccourci clavier : ÉchapRaccourci clavier : Échap
spaceRaccourci clavier : EspaceRaccourci clavier : Espace
backspaceRaccourci clavier : Retour arrièreRaccourci clavier : Retour arrière
deletedelRaccourci clavier : SupprRaccourci clavier : Suppr
tabRaccourci clavier : TabRaccourci clavier : Tab
updownleftrightRaccourci clavier : Flèche hautRaccourci clavier : Flèche basRaccourci clavier : Flèche gaucheRaccourci clavier : Flèche droiteRaccourci clavier : Flèche hautRaccourci clavier : Flèche basRaccourci clavier : Flèche gaucheRaccourci clavier : Flèche droite
plusRaccourci clavier : +Raccourci clavier : +
kf5,Raccourci clavier : KRaccourci clavier : F5Raccourci clavier : ,Raccourci clavier : KRaccourci clavier : F5Raccourci clavier : ,

Variantes

variant dessine les touches teintées, contourées ou surélevées. Il n'y a ni prop de ton ni prop de couleur : toutes les peintures dérivent de la couleur héritée.

vue
Raccourci clavier : Ctrl + Maj + P

soft

Raccourci clavier : Ctrl + Maj + P

outline

Raccourci clavier : Ctrl + Maj + P

elevated

<script setup lang="ts">
import { VHotkeys, VTypography, type HotkeysVariant } from 'vectis-ui'

const VARIANTS: HotkeysVariant[] = ['soft', 'outline', 'elevated']
</script>

<template>
  <div class="row">
    <div v-for="variant in VARIANTS" :key="variant" class="cell">
      <VHotkeys keys="mod+shift+p" :variant="variant" />
      <VTypography variant="caption" tone="muted">{{ variant }}</VTypography>
    </div>
  </div>
</template>

<style scoped>
.row {
  display: flex;
  flex-wrap: wrap;
  gap: var(--vectis-space-6);
}
.cell {
  display: grid;
  justify-items: center;
  gap: var(--vectis-space-2);
}
</style>

Tailles

size accepte xs ou sm, et compact retire 4px à l'une comme à l'autre. Une touche d'un seul caractère est carrée.

vue
Raccourci clavier : Ctrl + K

xs

Raccourci clavier : Ctrl + K

sm

Raccourci clavier : Ctrl + K

xs compact

Raccourci clavier : Ctrl + K

sm compact

<script setup lang="ts">
import { VHotkeys, VTypography, type HotkeysSize } from 'vectis-ui'

/* Two sizes only. A shortcut is chrome beside other text, so `xs` is the default and
   `sm` is already as large as one usefully gets. */
const SIZES: HotkeysSize[] = ['xs', 'sm']
</script>

<template>
  <div class="row">
    <div v-for="size in SIZES" :key="size" class="cell">
      <VHotkeys keys="mod+k" :size="size" variant="outline" />
      <VTypography variant="caption" tone="muted">{{ size }}</VTypography>
    </div>

    <div v-for="size in SIZES" :key="`${size}-compact`" class="cell">
      <VHotkeys keys="mod+k" :size="size" compact variant="outline" />
      <VTypography variant="caption" tone="muted">{{ size }} compact</VTypography>
    </div>
  </div>
</template>

<style scoped>
.row {
  display: flex;
  flex-wrap: wrap;
  align-items: end;
  gap: var(--vectis-space-6);
}
.cell {
  display: grid;
  justify-items: center;
  gap: var(--vectis-space-2);
}
</style>

Attaché

attached déplace la décoration de chaque touche vers le raccourci entier, si bien que la combinaison se lit comme une seule touche. C'est purement visuel : le balisage, les touches et le nom annoncé sont identiques.

vue
Raccourci clavier : Ctrl + Maj + K

One cap per key

Raccourci clavier : Ctrl + Maj + K

attached

Raccourci clavier : Ctrl + Maj + K

attached, no separator

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

<template>
  <div class="row">
    <div class="cell">
      <VHotkeys keys="mod+shift+k" variant="outline" />
      <VTypography variant="caption" tone="muted">One cap per key</VTypography>
    </div>

    <!-- The decoration moves from each cap to the shortcut as a whole, which is what
         puts the separator inside the key instead of between two of them. -->
    <div class="cell">
      <VHotkeys keys="mod+shift+k" attached variant="outline" />
      <VTypography variant="caption" tone="muted">attached</VTypography>
    </div>

    <div class="cell">
      <VHotkeys keys="mod+shift+k" attached separator="" variant="outline" />
      <VTypography variant="caption" tone="muted">attached, no separator</VTypography>
    </div>
  </div>
</template>

<style scoped>
.row {
  display: flex;
  flex-wrap: wrap;
  gap: var(--vectis-space-6);
}
.cell {
  display: grid;
  justify-items: center;
  gap: var(--vectis-space-2);
}
</style>

Plateforme

platform impose le système au lieu de le lire une fois le composant dans la page, ce dont a besoin un tableau montrant tous les systèmes.

vue

macOS

Raccourci clavier : Commande + KRaccourci clavier : Commande + Maj + EntréeRaccourci clavier : Alt + Retour arrière

Windows

Raccourci clavier : Ctrl + KRaccourci clavier : Win + Maj + EntréeRaccourci clavier : Alt + Retour arrière

Linux

Raccourci clavier : Ctrl + KRaccourci clavier : Super + Maj + EntréeRaccourci clavier : Alt + Retour arrière

Unknown

Raccourci clavier : Ctrl + KRaccourci clavier : Super + Maj + EntréeRaccourci clavier : Alt + Retour arrière
<script setup lang="ts">
import { VHotkeys, VTypography, type HotkeysPlatform } from 'vectis-ui'

/* The four the component knows. Without the prop it detects the one the reader is on,
   which is what the shortcuts everywhere else on this page are doing. */
const PLATFORMS: { value: HotkeysPlatform; label: string }[] = [
  { value: 'mac', label: 'macOS' },
  { value: 'windows', label: 'Windows' },
  { value: 'linux', label: 'Linux' },
  { value: 'other', label: 'Unknown' },
]
</script>

<template>
  <div class="grid">
    <template v-for="platform in PLATFORMS" :key="platform.value">
      <VTypography variant="caption" tone="muted">{{ platform.label }}</VTypography>
      <div class="keys">
        <VHotkeys keys="mod+k" :platform="platform.value" variant="outline" />
        <VHotkeys keys="meta+shift+enter" :platform="platform.value" variant="outline" />
        <VHotkeys keys="alt+backspace" :platform="platform.value" variant="outline" />
      </div>
    </template>
  </div>
</template>

<style scoped>
.grid {
  display: grid;
  grid-template-columns: auto 1fr;
  align-items: center;
  gap: var(--vectis-space-3) var(--vectis-space-5);
}
.keys {
  display: flex;
  flex-wrap: wrap;
  gap: var(--vectis-space-3);
}
</style>

Séparateur

separator est ce qui s'écrit entre deux touches, + par défaut. Une chaîne vide laisse l'écart en place et donne la convention macOS.

vue
Raccourci clavier : Ctrl + Maj + K

The default

Raccourci clavier : Ctrl + Maj + K

Nothing, the macOS convention

Raccourci clavier : Ctrl + Maj + K

A middle dot

Raccourci clavier : Ctrl + Maj + K

A slash

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

/* The caps are laid out with a gap of their own, so the separator is what is WRITTEN
   between them and never the space around it: an empty string leaves the gap alone
   and gives the macOS convention, where the symbols simply follow one another. */
const SEPARATORS = [
  { value: '+', label: 'The default' },
  { value: '', label: 'Nothing, the macOS convention' },
  { value: '·', label: 'A middle dot' },
  { value: '/', label: 'A slash' },
]
</script>

<template>
  <div class="grid">
    <template v-for="separator in SEPARATORS" :key="separator.label">
      <VHotkeys keys="mod+shift+k" :separator="separator.value" variant="outline" />
      <VTypography variant="caption" tone="muted">{{ separator.label }}</VTypography>
    </template>
  </div>
</template>

<style scoped>
.grid {
  display: grid;
  grid-template-columns: auto 1fr;
  align-items: center;
  gap: var(--vectis-space-3) var(--vectis-space-5);
  justify-items: start;
}
</style>

Dans le texte et dans les composants

Une touche prend sa taille dans l'échelle size, xs par défaut, et se place au milieu de la ligne qui l'entoure. Ses places habituelles sont la fin d'une ligne de menu, une infobulle, et le contrôle dont le raccourci est un second chemin.

vue

Press Raccourci clavier : Ctrl + K to open the command palette, then type the first letters of what you are after. Raccourci clavier : Échap puts it away again.

<script setup lang="ts">
import {
  VButton,
  VHotkeys,
  VMenu,
  VMenuItem,
  VMenuSeparator,
  VTooltip,
  VTypography,
} from 'vectis-ui'

const COMMANDS = [
  { label: 'New file', keys: 'mod+n' },
  { label: 'Save', keys: 'mod+s' },
  { label: 'Save as', keys: 'mod+shift+s' },
]
</script>

<template>
  <div class="stack">
    <!-- The cap takes its size from the text it sits in, so a shortcut written into a
         sentence keeps the line it is on. -->
    <VTypography class="prose">
      Press <VHotkeys keys="mod+k" /> to open the command palette, then type the first letters of
      what you are after. <VHotkeys keys="esc" /> puts it away again.
    </VTypography>

    <!-- At the end of a command row, which is where a shortcut is usually read. -->
    <VMenu>
      <template #trigger="{ triggerProps }">
        <VButton v-bind="triggerProps" variant="outline" tone="neutral">File</VButton>
      </template>
      <VMenuItem v-for="command in COMMANDS" :key="command.keys" :label="command.label">
        <template #end><VHotkeys :keys="command.keys" /></template>
      </VMenuItem>
      <VMenuSeparator />
      <VMenuItem label="Settings">
        <template #end><VHotkeys keys="mod+," /></template>
      </VMenuItem>
    </VMenu>

    <!-- Inside a tooltip, which is what its `#content` slot is for: rich but never
         interactive. -->
    <VTooltip>
      <template #default="{ triggerProps }">
        <VButton v-bind="triggerProps" variant="outline" tone="neutral">Save</VButton>
      </template>
      <template #content>Save this file <VHotkeys keys="mod+s" size="xs" /></template>
    </VTooltip>

    <!-- And inside the control the shortcut is a second route to. -->
    <VButton variant="outline" tone="neutral" class="search">
      Search the docs
      <VHotkeys keys="mod+k" variant="outline" />
    </VButton>
  </div>
</template>

<style scoped>
.stack {
  display: flex;
  flex-direction: column;
  align-items: start;
  gap: var(--vectis-space-5);
}
.prose {
  max-inline-size: 34rem;
  line-height: 1.9;
}
.search {
  inline-size: 18rem;
  justify-content: space-between;
}
</style>

Écoute

listen fait guetter au composant la combinaison qu'il affiche et émettre trigger. Les modificateurs sont comparés exactement, si bien que mod+k et mod+shift+k peuvent coexister. allowDefault conserve le raccourci du navigateur, et allowInInput laisse le raccourci se déclencher pendant une saisie dans un champ. Échap est signalé mais jamais annulé, il ferme donc toujours les dialogues. La comparaison lit le caractère produit par la touche : un symbole tapé avec Maj (?), un chiffre sur un clavier AZERTY et Option + lettre sur macOS ne correspondent pas, préférez donc les lettres et les touches nommées.

vue

Raccourci clavier : Ctrl + KPress it anywhere on the page. Fired 0 times.

Raccourci clavier : Ctrl + S With allowDefault, the browser still saves the page. Fired 0 times.

Raccourci clavier : Ctrl + JQuiet while a field has the focus: 0

Raccourci clavier : Ctrl + JWith allowInInput, it fires there too: 0

<script setup lang="ts">
import { ref } from 'vue'
import { VHotkeys, VInput, VTypography } from 'vectis-ui'

const opened = ref(0)
const saved = ref(0)
const strict = ref(0)
const permissive = ref(0)
</script>

<template>
  <div class="stack">
    <!-- No platform is pinned, so the caps show what this keyboard has and the matcher
         answers to the same thing: a Mac reader presses Command, everyone else Ctrl. -->
    <p class="line">
      <VHotkeys keys="mod+k" variant="outline" listen @trigger="opened++" />
      <VTypography as="span">Press it anywhere on the page. Fired {{ opened }} times.</VTypography>
    </p>

    <!-- The browser's own binding is cancelled unless allowDefault says otherwise,
         which is the whole point of taking over a combination it already uses. Here
         both happen: the count goes up and the browser opens its save dialog. -->
    <p class="line">
      <VHotkeys keys="mod+s" variant="outline" listen allow-default @trigger="saved++" />
      <VTypography as="span" tone="muted">
        With allowDefault, the browser still saves the page. Fired {{ saved }} times.
      </VTypography>
    </p>

    <VInput label="Type in here, then press the shortcut below" class="field" />

    <p class="line">
      <VHotkeys keys="mod+j" variant="outline" listen @trigger="strict++" />
      <VTypography as="span">Quiet while a field has the focus: {{ strict }}</VTypography>
    </p>

    <p class="line">
      <VHotkeys keys="mod+j" variant="outline" listen allow-in-input @trigger="permissive++" />
      <VTypography as="span">With allowInInput, it fires there too: {{ permissive }}</VTypography>
    </p>
  </div>
</template>

<style scoped>
.stack {
  display: flex;
  flex-direction: column;
  align-items: start;
  gap: var(--vectis-space-4);
}
.line {
  display: flex;
  align-items: center;
  gap: var(--vectis-space-3);
  margin: 0;
}
.field {
  inline-size: 22rem;
}
</style>

API

Props

PropTypeDéfaut
keysstringaucune
La combinaison, séparée par + : mod+k, ctrl+shift+p, alt+enter. La casse et les espaces sont sans importance. mod est le modificateur multiplateforme, Commande sur macOS et Ctrl partout ailleurs, tandis que meta désigne la touche Commande ou Windows elle-même. Un jeton inconnu s'affiche tel qu'il a été déclaré, et la touche + s'écrit plus.
variantHotkeysVariant'soft' | 'outline' | 'elevated''soft'
Comment une touche est dessinée : teintée, contourée, ou soulevée de la page.
attachedbooleanfalse
Dessine toute la combinaison comme une seule touche plutôt que plusieurs, ce qui place le séparateur à l'intérieur de la touche au lieu de le mettre entre deux. C'est purement visuel : le balisage et le nom annoncé sont identiques dans les deux cas.
sizeHotkeysSize'xs' | 'sm''xs'
La taille des touches. Un raccourci est du décor à côté d'un autre texte, il part donc de la plus petite.
compactbooleanfalse
Retire 4px à la hauteur, en laissant le rembourrage et le texte tels quels.
platformHotkeysPlatform'mac' | 'windows' | 'linux' | 'other'aucune
Force le système d'exploitation du clavier au lieu de le détecter, pour un rendu déterministe ou un hôte qui le sait déjà.
separatorstring'+'
Ce qui est écrit entre deux touches. Une chaîne vide donne la convention macOS, où les symboles se suivent simplement.
listenbooleanfalse
Écoute réellement la combinaison et la rapporte. Désactivé par défaut : un composant dont le métier est d'afficher un raccourci ne doit pas capturer le clavier de la page sans qu'on le lui demande.
allowDefaultbooleanfalse
Pendant l'écoute, laisse le navigateur continuer de faire ce que la combinaison fait normalement. Sans lui, le navigateur est arrêté, ce qui est tout l'intérêt de reprendre une combinaison. Échap n'est jamais arrêté : il doit rester la demande de fermeture des dialogues.
allowInInputbooleanfalse
Pendant l'écoute, se déclenche même quand le lecteur est en train de saisir dans un champ. Désactivé par défaut, pour qu'un raccourci ne parte pas au milieu d'une phrase.
labelstringaucune
Ce que les lecteurs d'écran annoncent. Il retombe sur le dictionnaire du design system, qui écrit les modificateurs en mots : le glyphe gagne à l'écran, le mot gagne dans le nom accessible.

Événements

ÉvénementType
trigger[event: KeyboardEvent]
La combinaison a été pressée, avec l'événement clavier d'origine. Cet événement ne part que si listen est posé.