MenuChevron Down
Select Sélection - Docs - Artefact

Select Sélection

Forms
Tier 1

Introduction

Un contrôle déroulant pour choisir une ou plusieurs options dans une liste — une alternative accessible et stylisée à l'élément natif <select>.

Quand chercher autre chose :

  • Avec moins de ~5 options, un « RadioGroup » est généralement plus clair.- Si l'utilisateur doit pouvoir taper pour filtrer les options, utilisez « Combobox ». Le composant restitue un <select> natif visuellement caché à côté de l'interface utilisateur personnalisée, donc un accessoire « name » le fait participer à la soumission de formulaire régulière sans câblage supplémentaire.

Interaction au clavier

Le déclencheur est un bouton role="combobox" ; le focus reste dessus tandis que l'option en surbrillance est signalée via aria-activedescendant.

KeyBehavior
Enter / SpaceOpen the list; when open, select the highlighted option.
ArrowDown / ArrowUpOpen the list, or move the highlight (wraps, skips disabled options).
Home / EndHighlight the first / last enabled option.
EscapeClose the list.
TabClose the list and move focus on.
Printable charactersTypeahead: jumps to the first option whose label matches the typed prefix. When the list is closed (single mode), the match is selected directly, like a native <select>.

L'ouverture de la liste met en surbrillance l'option actuellement sélectionnée (ou la première option activée) et la navigation au clavier maintient l'option en surbrillance affichée.

Hydratation

Niveau 1 — auto-interactif. L'ouverture de la liste déroulante et la sélection d'une option nécessitent le client JS, et il n'y a pas de solution de repli statique (le <select> natif est visuellement masqué et n'existe que pour la soumission de formulaires), donc Select s'hydrate par défaut. Passez interactive={false} pour forcer un rendu purement statique.

interactive propRésultat
omittedHydrates as an island
trueHydrates as an island
falseStatic — no client JS

Toutes les décisions d'interactivité dans la bibliothèque sont acheminées via l'assistant partagé shouldHydrate() dans app/components/ui/island-utils.ts.

Utilisation

React
Solid
Svelte
Vue
Hono
import { Select } from "../components/ui";

const items = [
  { label: "React", value: "react" },
  { label: "Solid", value: "solid" },
  { label: "Svelte", value: "svelte", disabled: true },
  { label: "Vue", value: "vue" },
  { label: "Hono", value: "hono" },
];

export default function MyPage() {
  return (
    <Select
      items={items}
      label="Framework"
      placeholder="Select a framework"
      allowClear
    />
  );
}

Sélection multiple

La liste reste ouverte pendant que les options sont basculées et le déclencheur affiche les étiquettes sélectionnées jointes par des virgules.

<Select
  multiple
  items={items}
  label="Frameworks"
  placeholder="Select frameworks"
  defaultValue={["hono"]}
/>

Sous une forme

Le <select> natif caché porte la sélection, donc une publication sous forme simple fonctionne :

<form method="post" action="/frameworks">
  <Select name="framework" items={items} label="Framework" required />
  <Button type="submit">Save</Button>
</form>

Tailles et variantes

<Select items={items} size="sm" placeholder="Small" />
<Select items={items} size="lg" variant="surface" placeholder="Large surface" />
<Select items={items} invalid placeholder="Invalid state" />

Constructeur de pages CMS

Ce composant est disponible sous forme de bloc select dans Page Builder (content/pages/*.json) :

{
  "type": "select",
  "label": "Framework",
  "placeholder": "Select a framework",
  "items": [
    { "label": "React", "value": "react" },
    { "label": "Hono", "value": "hono" }
  ]
}

Propriétés

PropriétéTypeDescription
itemsSelectItem[]Les options à afficher dans la liste.
labelChildÉtiquette rendue au-dessus du déclencheur et associée à celui-ci.
placeholderstringTexte affiché dans le déclencheur alors que rien n'est sélectionné.
allowClearbooleanAffiche un bouton d'effacement une fois qu'une sélection existe.
multiplebooleanPermet de sélectionner plusieurs options ; la liste reste ouverte lors du basculement.
defaultValuestring[]Sélection initiale (non contrôlée). Alias ​​de selectedValues.
selectedValuesstring[]Sélection initiale (identique à defaultValue).
deselectablebooleanEn mode simple, cliquer à nouveau sur l'option sélectionnée l'efface.
namestringNom du <select> natif masqué, pour la soumission du formulaire.
disabledbooleanDésactive tout le contrôle.
invalidbooleanMarque le contrôle comme invalide (aria-invalid, bordure d'erreur).
readOnlybooleanLa sélection est visible mais la liste ne peut pas être ouverte.
requiredbooleanMarque le contrôle requis (aria-required, sélection masquée required).
openbooleanÉtat ouvert contrôlé de la liste déroulante.

| size | `"xs" \ | "sm" \ | "md" \ | "lg" \ | "xl"` | Size of the trigger and list. Defaults to md. |

| variant | `"outline" \ | "surface"` | Visual variant of the trigger. Defaults to outline. |

| interactive | boolean | Annule la décision d’hydratation (voir ci-dessous). | | onValueChange | (values: string[]) => void | Appelé avec la sélection complète à chaque fois qu'elle change (sélectionner, désélectionner, effacer). | | onItemSelect | (value: string) => void | Appelé avec la valeur de l’option avec laquelle a interagi. | | onClear | () => void | Appelé lorsque le bouton d'effacement vide la sélection. | | onOpenChange | (open: boolean) => void | Appelé lorsque la liste déroulante s'ouvre ou se ferme. |

Les accessoires de rappel ne fonctionnent que lorsque le Select est composé à partir de code côté client (à l'intérieur d'une autre île). Les accessoires sérialisés à partir d’une route rendue par le serveur doivent être des données simples.

Sélectionner un élément

PropriétéTypeDescription
labelstringLe texte affiché pour l’option. Également utilisé pour la correspondance de frappe.
valuestringLa valeur unique de l'option.
disabledbooleanSi l'option peut être sélectionnée.