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
Nom | Type | Défaut | Obligatoire | Description |
---|---|---|---|---|
id | Function | () => getRandomId('search', 'input') | Identifiant unique pour la barre de recherche. | |
label | String | '' | Libellé de la barre de recherche. | |
buttonText | String | '' | Texte du bouton de recherche. | |
modelValue | String | '' | Valeur liée à la barre de recherche. | |
placeholder | String | 'Rechercher' | Placeholder pour la barre de recherche. | |
large | Boolean | false | Si true , utilise une version plus grande de la barre de recherche. | |
labelVisible | Boolean | false | Si true , affiche le libellé de la barre de recherche. | |
disabled | Boolean | false | Si 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 DsfrButton from '../DsfrButton/DsfrButton.vue'
import DsfrInput from '../DsfrInput/DsfrInput.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
}