Exporter et restructurer les entrées

Les entrées FormKit sont livrées avec beaucoup de balisage. Cela est utile pour garantir que les entrées sont écrites de manière accessible. Cependant, il est parfois judicieux de modifier la structure existante d'une entrée FormKit. En utilisant le CLI FormKit, nous pouvons exporter les entrées open source de FormKit et modifier leur structure originale - ou même leur fonctionnalité.

Dans ce guide, nous allons exporter l'entrée de texte et la restructurer pour mieux supporter un design d'étiquette flottante.

Exporter via CLI

FormKit est livré avec son propre CLI pour faciliter l'exportation des entrées. À la base de votre projet, exécutez :

npx formkit export

L'exécution de cette commande vous invite à sélectionner l'une des entrées open source de FormKit à exporter :

? Quelle entrée voulez-vous exporter ? ›
❯   bouton
    soumettre
    case à cocher
    fichier
    formulaire
    groupe
    caché
    liste
    radio
  ↓ sélectionner

Nous allons sélectionner l'entrée de texte et permettre au CLI de créer un nouveau répertoire /inputs dans /src :

✔ Quelle entrée voulez-vous exporter ? › texte
✔ Quelle langue doit être utilisée ? › JavaScript
? Où l'entrée doit-elle être exportée (par rapport au répertoire actuel) ? ›
./src/inputs

En regardant notre entrée exportée, text.js, nous pouvons voir les sections sous-jacentes qui composent l'entrée FormKit. Ces sections sont fournies sous forme de petites fonctions composables. Chaque section représente un seul FormKitSchemaNode et les arguments passés à cette section sont ses enfants :

// text.js
import {
  outer,
  inner,
  wrapper,
  label,
  help,
  messages,
  message,
  icon,
  prefix,
  suffix,
  textInput,
} from '@formkit/inputs'
/**
 * Définition de l'entrée pour un texte.
 * @public
 */
export const text = {
  /**
   * Le schéma réel de l'entrée, ou une fonction qui renvoie le schéma.
   */
  schema: outer(
    wrapper(
      label('$label'),
      inner(
        icon('prefix', 'label'),
        prefix(),
        textInput(),
        suffix(),
        icon('suffix')
      )
    ),
    help('$help'),
    messages(message('$message.value'))
  ),
  /**
   * Le type de nœud, peut être une liste, un groupe ou une entrée.
   */
  type: 'input',
  /**
   * Un tableau de props supplémentaires à accepter pour cette entrée.
   */
  props: [],
  /**
   * Fonctionnalités supplémentaires qui devraient être ajoutées à votre entrée
   */
  features: [],
}

Dans cet exemple, nous n'allons pas écraser l'entrée de texte par défaut de FormKit, mais plutôt, créer une entrée de texte personnalisée qui va utiliser des étiquettes flottantes. Allons de l'avant et renommons le fichier texte que nous venons d'exporter en floatingLabelTextInput.js :

src/
  |inputs/
  |   |- t̶e̶x̶t̶ floatingLabelTextInput.js

Dans floatingLabelTextInput.js, changeons le nom de la variable exportée en floatingLabelTextInput à partir de text.

...
export const t̶e̶x̶t̶ floatingLabelTextInput = {
  ...
}

Enregistrer l'entrée

Pour enregistrer globalement notre nouvelle entrée, nous devons ajouter notre floatingLabelTextInput à la configuration globale. Nous pouvons le faire où que nous enregistrions le plugin FormKit :

//main.js
import { createApp } from 'vue'
import App from './App.vue'
import { plugin, defaultConfig } from '@formkit/vue'
import '@formkit/themes/genesis'
import { floatingLabelTextInput } from '../src/inputs/floatingLabelTextInput'

const config = defaultConfig({
  inputs: {
    floatingLabelTextInput,
  },
})

createApp(App).use(plugin, config).mount('#app')

Modifier le schéma

Nous allons maintenant modifier le schéma de floatingLabelTextInput pour mieux supporter les étiquettes flottantes, qui sont généralement mises en œuvre en utilisant le sélecteur de frères CSS : ~. Pour utiliser un sélecteur CSS comme :focus ~ label, notre balise <label> doit être placée après notre balise <input>. Avec notre schéma déjà exporté, ce changement est facile à faire :

export const floatingLabelTextInput = {
  schema: outer(
    wrapper(
      /*
      * Suppression de l'étiquette
      */
      l̶a̶b̶e̶l̶(̶'̶$̶l̶a̶b̶e̶l̶'̶)̶, // ❌ supprimé d'ici
      inner(
        icon('prefix', 'label'),
        prefix(),
        textInput(),
        label('$label'), // 👈 et maintenant placé ici
        suffix(),
        icon('suffix')
      )
    ),
    help('$help'),
    messages(message('$message.value'))
  ),
  ...
}

Utilisation des aides

Le package @formkit/inputs exporte un certain nombre de fonctions d'aide qui peuvent être facilement appliquées aux fonctions de schéma composable. Les aides disponibles sont :

import { $attrs, $if, $for, $extend, $root } from '@formkit/inputs'

L'importation de la fonction $attrs du package d'entrée de FormKit nous permet d'étendre le schéma de n'importe quelle section avec des attributs supplémentaires. Dans cet exemple, nous l'utilisons pour modifier la section d'étiquette et changer sa classe de formkit-label à formkit-label-floating. De plus, nous ajouterons un attribut data-has-value :

import {
  outer,
  inner,
  wrapper,
  label,
  help,
  messages,
  message,
  icon,
  prefix,
  suffix,
  textInput,
  /*
   * Importation de $attrs
   */
  $attrs,
} from '@formkit/inputs'

export const floatingLabelTextInput = {
  schema: outer(
    wrapper(
      inner(
        icon('prefix', 'label'),
        prefix(),
        textInput(),
        /*
        * Utilisation de la fonction $attrs pour passer l'objet attrs à la section d'étiquette avec une nouvelle
          définition de classe.
        */
        $attrs(
          {
            class: '$classes.labelFloating',
            'data-has-value': '$_value !== "" && $_value !== undefined',
            for: '$id',
          },
          label('$label')
        ),
        suffix(),
        icon('suffix')
      )
    ),
    help('$help'),
    messages(message('$message.value'))
  ),

  type: 'input',

  props: [],

  features: [],
}

Après avoir ajouté un style approprié, nous pouvons voir que notre nouvelle entrée personnalisée a son <label> déplacé dans la structure HTML et utilise des étiquettes flottantes :

Charger l'exemple en direct

Prochaines étapes

Dans ce guide, nous avons exporté l'entrée text intégrée en utilisant l'outil CLI de FormKit et utilisé le fichier exporté comme point de départ pour une nouvelle variation d'étiquette flottante. Cependant, la fonction d'exportation permet aux développeurs de faire bien plus que cela ! Que ce soit pour remplacer les entrées existantes de FormKit, ou ajouter de nouvelles entrées personnalisées avec des sections modifiées, ajoutées, supprimées ou déplacées — nous avons hâte de voir toutes les façons dont vous utilisez cette fonctionnalité !

En savoir plus sur la création d'entrées personnalisées.Lire le guide