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() => getRandomId('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.
labelVisibleBooleanfalseSi true, affiche le libellé 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 du curseur"
      />
    </div>
    <p class="fr-my-4w">
      {{ value }}
    </p>
  </div>
</template>

⚙️ Code source du composant

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

import DsfrInput from '../DsfrInput/DsfrInput.vue'
import DsfrButton from '../DsfrButton/DsfrButton.vue'

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

export type { DsfrSearchBarProps }

withDefaults(defineProps<DsfrSearchBarProps>(), {
  id: () => getRandomId('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-visible="labelVisible"
      :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
  labelVisible?: boolean
  large?: boolean
  buttonText?: string
  modelValue?: string
  placeholder?: string
  disabled?: boolean
}