Skip to content

Barre de recherche - DsfrSearchBar

🌟 Introduction

La barre de recherche est un système de navigation qui permet à l'utilisateur d’accéder rapidement à un contenu en lançant une recherche sur un mot clé ou une expression.

🏅 La documentation sur la barre de recherche sur le DSFR

La story sur la barre de recherche sur le storybook de VueDsfr

📐 Structure

La barre de recherche se compose des éléments suivants :

  • un champs de saisie ;
  • un bouton primaire.

🛠️ Props

NomTypeDéfautObligatoireDescription
idFunction() => useRandomId('search', 'input')Identifiant unique pour la barre de recherche.
labelString''Libellé de la barre de recherche.
buttonTextString''Texte du bouton de recherche.
modelValueString''Valeur liée à la barre de recherche.
placeholderString'Rechercher'Placeholder pour la barre de recherche.
largeBooleanfalseSi true, utilise une version plus grande de la barre de recherche.
disabledBooleanfalseSi true, désactive la barre de recherche.

📡 Événements

  • update:modelValue: Événement émis lorsque la valeur de la barre de recherche est mise à jour.
  • search: Événement émis lors de l'exécution d'une recherche.

📝 Exemple

vue
<script lang="ts" setup>
import { ref } from 'vue'

import DsfrSearchBar from '../DsfrSearchBar.vue'

const value = ref('')
</script>

<template>
  <div class="fr-container fr-py-4w">
    <div>
      <DsfrSearchBar
        v-model="value"
        label="Label de la barre de recherche"
      />
    </div>
    <p class="fr-my-4w">
      {{ value }}
    </p>
  </div>
</template>

⚙️ Code source du composant

vue
<script lang="ts" setup>
import { useRandomId } from '../../utils/random-utils'
import DsfrButton from '../DsfrButton/DsfrButton.vue'
import DsfrInput from '../DsfrInput/DsfrInput.vue'

import type { DsfrSearchBarProps } from './DsfrSearchBar.types'

export type { DsfrSearchBarProps }

withDefaults(defineProps<DsfrSearchBarProps>(), {
  id: () => useRandomId('search', 'input'),
  label: '',
  buttonText: '',
  modelValue: '',
  placeholder: 'Rechercher',
})

const emit = defineEmits<{
  (e: 'update:modelValue', payload: string): void
  (e: 'search', payload: string): void
}>()
</script>

<template>
  <div
    class="fr-search-bar"
    :class="{ 'fr-search-bar--lg': large }"
    role="search"
  >
    <DsfrInput
      :id="id"
      type="search"
      :placeholder="placeholder"
      :model-value="modelValue"
      :label="label"
      :disabled="disabled"
      :aria-disabled="disabled"
      @update:model-value="emit('update:modelValue', $event)"
      @keydown.enter="emit('search', modelValue)"
    />
    <DsfrButton
      title="Rechercher"
      :disabled="disabled"
      :aria-disabled="disabled"
      @click="emit('search', modelValue)"
    >
      {{ buttonText }}
    </DsfrButton>
  </div>
</template>

<style>
.fr-search-bar > .fr-label + .fr-input {
  margin: 0;
}

/**
 * Obligé de faire ça car la couleur est codée en dur dans le DSFR
 * sans prendre en compte que ce champ pouvait être disabled.
 */
.fr-search-bar .fr-input:disabled {
  box-shadow: inset 0 -2px 0 0 var(--border-disabled-grey);
  color: var(--text-disabled-grey);
}
</style>
ts
export type DsfrSearchBarProps = {
  id?: string
  label?: string
  large?: boolean
  buttonText?: string
  modelValue?: string
  placeholder?: string
  disabled?: boolean
}