Entrées

August 16, 2026 · View on GitHub

Champs de texte, cases à cocher, bascules, boutons radio, curseurs, steppers numériques, des listes déroulantes et un champ de recherche avec un bouton clair.


Entrée — Champ de texte sur une seule ligne

type UI struct {
    email proton.Editor
}

proton.Input(ctx, &u.email, "your@email.com")

// read the value any time
fmt.Println(u.email.Text())

Le deuxième argument est le texte d'espace réservé affiché lorsque le champ est vide.

proton.Input(ctx proton.Context, state *proton.Editor, hint string)

TextArea — Champ de texte multiligne

Identique à Input mais l'utilisateur peut appuyer sur Entrée pour ajouter des lignes. Bon pour les messages, notes, quelque chose de plus long qu’une seule ligne.

type UI struct {
    bio proton.Editor
}

proton.TextArea(ctx, &u.bio, "Tell us something...")

fmt.Println(u.bio.Text())
proton.TextArea(ctx proton.Context, state *proton.Editor, hint string)

Entrée de recherche

Un champ de texte avec une icône de recherche à gauche et un bouton d'effacement (×) qui apparaît quand il y a quelque chose à effacer. Renvoie la chaîne de requête actuelle.

type UI struct {
    search proton.SearchState
}

q := proton.SearchInput(ctx, &u.search, "Search notes...")

// filter your data using q
filtered := filter(items, q)

SearchState contient à la fois l'éditeur et le bouton d'effacement interne — déclarez un dans votre structure, ne le construisez pas vous-même.

proton.SearchInput(ctx proton.Context, state *proton.SearchState, placeholder string) string

Case à cocher

Renvoie « true » sur le cadre sur lequel l'utilisateur le fait basculer. Lire la valeur actuelle à partir de état.Valeur.

type UI struct {
    agreed proton.Bool
}

if proton.Checkbox(ctx, &u.agreed, "I have read the terms and conditions") {
    // just changed — u.agreed.Value is the new state
    fmt.Println("now:", u.agreed.Value)
}

// read it any time without caring about the change event
if u.agreed.Value {
    proton.SuccessText(ctx, "Thanks for agreeing (we know you didn't read it)")
}
proton.Checkbox(ctx proton.Context, state *proton.Bool, label string) bool

Basculer

Un interrupteur marche/arrêt de style matériel. Même API que Checkbox, look différent. À utiliser pour les paramètres qui prennent effet immédiatement plutôt que de nécessiter un bouton Enregistrer.

type UI struct {
    darkMode proton.Bool
}

if proton.Toggle(ctx, &u.darkMode, "Dark mode") {
    if u.darkMode.Value {
        applyDarkTheme()
    } else {
        applyLightTheme()
    }
}
proton.Toggle(ctx proton.Context, state *proton.Bool, label string) bool

Bouton Radio

Pour choisir exactement une option dans un groupe. Tous les boutons d'un partage de groupe un champ d'état proton.Enum. La « clé » est ce qui est stocké dans « group.Value » lorsque cette option est sélectionnée.

type UI struct {
    plan proton.Enum
}

proton.RadioButton(ctx, &u.plan, "free", "Free")
proton.Gap(ctx, 4)
proton.RadioButton(ctx, &u.plan, "pro", "Pro — \$9/mo")
proton.Gap(ctx, 4)
proton.RadioButton(ctx, &u.plan, "team", "Team — \$29/mo")

fmt.Println("selected:", u.plan.Value) // "free", "pro", or "team"

Renvoie « true » sur le cadre où la sélection change.

proton.RadioButton(ctx proton.Context, group *proton.Enum, key string, label string) bool

Boutons radio horizontaux — placez-les dans « Row » :

proton.Row(ctx,
    func(ctx proton.Context) { proton.RadioButton(ctx, &u.size, "s", "S") },
    func(ctx proton.Context) { proton.Gap(ctx, 12) },
    func(ctx proton.Context) { proton.RadioButton(ctx, &u.size, "m", "M") },
    func(ctx proton.Context) { proton.Gap(ctx, 12) },
    func(ctx proton.Context) { proton.RadioButton(ctx, &u.size, "l", "L") },
)

Curseur

Une poignée de déplacement horizontale pour une valeur comprise entre 0,0 et 1,0. Adaptez-le à quelle que soit la gamme dont vous avez besoin.

type UI struct {
    vol proton.Float
}

v := proton.Slider(ctx, &u.vol)

// v is 0.0–1.0, scale it
volume := int(v * 100)
proton.Caption(ctx, fmt.Sprintf("Volume: %d%%", volume))

Vous pouvez également lire la valeur directement à partir de l'état :

proton.Slider(ctx, &u.vol)
fmt.Println(u.vol.Value) // 0.0 to 1.0
proton.Slider(ctx proton.Context, state *proton.Float) float32

Barre de progression

Non interactif – affiche simplement la progression sous forme de barre remplie. Passer un flotteur32 entre 0,0 et 1,0.

proton.ProgressBar(ctx, 0.65)    // 65% done
proton.ProgressBar(ctx, 1.0)     // done
proton.ProgressBar(ctx, progress) // from a variable
proton.ProgressBar(ctx proton.Context, progress float32)

##NuméroEntrée

Un stepper avec les boutons − et +. Gère la taille min, max et pas pour vous. Renvoie la valeur actuelle.

type UI struct {
    qty    proton.NumberState
    rating proton.NumberState
}

// integers
qty := proton.NumberInput(ctx, &u.qty, 1, 99, 1)
proton.Caption(ctx, fmt.Sprintf("%d items", int(qty)))

// floats
rating := proton.NumberInput(ctx, &u.rating, 0, 5, 0.5)
proton.Caption(ctx, fmt.Sprintf("%.1f / 5.0", rating))
proton.NumberInput(ctx proton.Context, state *proton.NumberState, min, max, step float64) float64

La valeur commence à « min » lors de la première utilisation. Étape >= 1 affiche des nombres entiers ; l'étape < 1 affiche deux décimales.


Boîte de sélection

Un sélecteur déroulant. Renvoie l'index de l'option actuellement sélectionnée.

type UI struct {
    lang proton.SelectBoxState
}

langs := []string{"Go", "Rust", "Zig", "C", "Python"}

i := proton.SelectBox(ctx, &u.lang, langs)
proton.Caption(ctx, "You picked: "+langs[i])

La liste déroulante apparaît sous le bouton lorsque vous cliquez dessus. En cliquant n'importe où à l'extérieur, il le ferme.

proton.SelectBox(ctx proton.Context, state *proton.SelectBoxState, options []string) int

Selected commence à 0. Cochez state.Selected >= 0 si vous avez besoin de savoir si l'utilisateur a explicitement choisi quelque chose.


Exemple de formulaire complet

type SettingsUI struct {
    username proton.Editor
    bio      proton.Editor
    notify   proton.Bool
    dark     proton.Bool
    plan     proton.Enum
    volume   proton.Float
    save     proton.Clickable
}

func drawSettings(ctx proton.Context, s *SettingsUI) {
    proton.H4(ctx, "Settings")
    proton.Gap(ctx, 20)

    proton.Label(ctx, "Username")
    proton.Gap(ctx, 4)
    proton.Input(ctx, &s.username, "your_username")
    proton.Gap(ctx, 14)

    proton.Label(ctx, "Bio")
    proton.Gap(ctx, 4)
    proton.TextArea(ctx, &s.bio, "Tell us something...")
    proton.Gap(ctx, 20)

    proton.Toggle(ctx, &s.dark, "Dark mode")
    proton.Gap(ctx, 8)
    proton.Checkbox(ctx, &s.notify, "Email notifications")
    proton.Gap(ctx, 20)

    proton.Label(ctx, "Plan")
    proton.Gap(ctx, 6)
    proton.RadioButton(ctx, &s.plan, "free", "Free")
    proton.Gap(ctx, 4)
    proton.RadioButton(ctx, &s.plan, "pro", "Pro (\$9/mo)")
    proton.Gap(ctx, 4)
    proton.RadioButton(ctx, &s.plan, "team", "Team (\$29/mo)")
    proton.Gap(ctx, 20)

    proton.Label(ctx, fmt.Sprintf("Volume: %.0f%%", s.volume.Value*100))
    proton.Gap(ctx, 4)
    proton.Slider(ctx, &s.volume)
    proton.Gap(ctx, 28)

    proton.Pad(ctx, 4, func(ctx proton.Context) {
        if proton.Button(ctx, &s.save, "Save Settings") {
            handleSave(s)
        }
    })
}