FrançaisEnglish

02 — Catalogue de widgets

Tous les constructeurs statiques Element.<Nom>(...), regroupés par catégorie.

Convention : chaque constructeur retourne un Element, ce qui permet de composer des chaînes fluentes — .AddChild(...), .Attr(...), .Style(...), .On<Event>(...) fonctionnent sur tous les widgets.

Texte et titres

Constructeur HTML Remarques
Element.Heading(text) <h1> Grand titre de page. Un seul par page.
Element.Label(text) <p> Paragraphe en lecture seule.
Element.Pre(text) <pre> Panneau de sortie en police à chasse fixe. Souvent associé à .Id(...) pour qu'OnResult puisse y router le contenu.
Element.Link(text, url) <a href> Lien hypertexte vers le navigateur de l'OS. Voir les remarques sur LinkLabel ci-dessous.
Element.Stack()
    .AddChild(Element.Heading("Hello"))
    .AddChild(Element.Label("Welcome to the demo."))
    .AddChild(Element.Pre("(submit to see the payload)").Id("out"))

LinkLabel

Element.Link(text, url) émet un <a href> dont l'attribut onclick route via le navigateur de l'OS (xdg-open / open / ShellExecute). L'utilisateur n'atterrit jamais dans la webview.

Pour naviguer dans la même fenêtre, créez un new Element("a") et attachez votre propre .OnClick(h).

Boutons

Constructeur HTML Remarques
Element.Button(caption) <button> À câbler via .OnClick(handler).
Element.Button("Save")
    .OnClick((req: string) => req)        // echo the form
    .OnResult("out")                       // dump into #out

Enabled(false) produit un bouton désactivé grisé. Tooltip(t) ajoute une infobulle native de l'OS via l'attribut HTML title.

Saisies sur une ligne

Constructeur HTML WinForms
Element.Input(name) <input type=text> TextBox
Element.Password(name) <input type=password> TextBox (masqué)
Element.Number(name, min, max, step) <input type=number> composite + ▲/▼ NumericUpDown
Element.Slider(name, min, max, step) <input type=range> TrackBar
Element.DatePicker(name) <input type=date> DateTimePicker (date)
Element.TimePicker(name) <input type=time> DateTimePicker (heure)
Element.ColorPicker(name) <input type=color> ColorDialog intégré
Element.MaskedTextBox(name, pattern, inputmode) <input pattern=… inputmode=…> MaskedTextBox

Chaque name est collecté automatiquement par le pont d'état du formulaire — les handlers reçoivent un objet JSON dont les clés sont ces noms. Voir 03-events-and-state.md.

Element.Row()
    .AddChild(Element.Label("Quantity:").Size(120, 0))
    .AddChild(Element.Number("qty", 1, 100, 1))

Les valeurs min/max de Number sont 0 par défaut — passez (name, 0, 0, 0) pour laisser les trois attributs non définis.

Depuis la v0.0.5, Number est un composant composite (le <input type=number> plus une colonne de boutons verticaux / ). WebKitGTK ne dessine pas le ::-webkit-inner-spin-button natif, donc les boutons sont toujours visibles et se comportent de manière identique sur les trois moteurs OS.

Texte multi-lignes

Constructeur HTML WinForms
Element.Textarea(name) <textarea> TextBox (Multiline)
Element.RichTextBox(name) <div contenteditable=true> RichTextBox (v0.0.9)
Element.Textarea("message")
    .Attr("placeholder", "Type a message…")
    .Size(0, 80)        // height in px; 0 = auto width

Element.RichTextBox("notes")
    .Attr("placeholder-text", "Write notes here…")
    .Style("min-height:120px")

textarea n'est intentionnellement pas redimensionnable par défaut — la poignée de glissement déstabilise les mises en page déclaratives. Réactivez via .Style("resize:vertical") si nécessaire.

RichTextBox (v0.0.9) accepte le formatage en ligne via les raccourcis clavier intégrés du navigateur (Ctrl-B / Ctrl-I / Ctrl-U) et le contenu riche collé. Le payload du formulaire rapporte le contenu enrichi sous forme de HTML interne sous la clé name du widget.

Widgets booléens / de choix

Constructeur HTML WinForms
Element.CheckBox(name) <input type=checkbox> CheckBox (nu)
Element.CheckBoxLabel(name, caption) <label><input type=checkbox> caption</label> CheckBox (.Text)
Element.Radio(name, value) <input type=radio> RadioButton (nu)
Element.RadioLabel(name, value, caption) <label><input type=radio> caption</label> RadioButton (.Text)

Utilisez la variante *Label lorsque vous souhaitez que la légende soit cliquable — correspond à la propriété Text de WinForms et aux attentes des utilisateurs.

Element.Stack()
    .AddChild(Element.CheckBoxLabel("agree", "I agree to the terms"))
    .AddChild(Element.Row()
        .AddChild(Element.Label("Priority:").Size(120, 0))
        .AddChild(Element.RadioLabel("priority", "low",    "Low"))
        .AddChild(Element.RadioLabel("priority", "normal", "Normal")
            .Attr("checked", "checked"))
        .AddChild(Element.RadioLabel("priority", "high",   "High")))

Les boutons radio d'un même groupe name sont mutuellement exclusifs.

Listes

Constructeur HTML WinForms
Element.Select(name) + Element.Option(value, label) <select><option> ComboBox
Element.ListBox(name, size) <select multiple> ListBox
Element.CheckedListBox(name) + Element.CheckedItem(name, value, label) <ul> de <input type=checkbox> CheckedListBox
Element.ListView(headers, bodyId) + Element.ListViewRow(values) <table> ListView (mode détails)
let cols: List<string> = ["Name", "Size", "Modified"]
let r1:  List<string> = ["readme.md", "2 KB", "today"]

Element.ListView(cols, "files-body")
    .AddChild(Element.ListViewRow(r1))

Le paramètre bodyId est l'id du <tbody> — passez-le lorsque vous utiliserez Page.AppendInner(win, bodyId, …) pour faire grandir le tableau au moment de l'exécution (voir 03-events-and-state.md). Passez "" pour omettre l'id.

Arborescence (v0.0.7)

Constructeur Rôle WinForms
Element.TreeView() Conteneur racine. TreeView
Element.TreeNode(caption) Nœud extensible façon dossier (HTML5 <details>). TreeNode
Element.TreeLeaf(caption) Élément terminal. TreeNode (feuille)
Element.TreeView()
    .AddChild(Element.TreeNode("src")
        .AddChild(Element.TreeNode("parser")
            .AddChild(Element.TreeLeaf("ast.am"))
            .AddChild(Element.TreeLeaf("parser.am")))
        .AddChild(Element.TreeLeaf("main.am")))
    .AddChild(Element.TreeLeaf("README.md"))

Construit sur <details> / <summary>, donc le développement/réduction et la navigation clavier fonctionnent sans aucun JS. Passez .Attr("open", "open") sur un TreeNode pour le rendre développé par défaut. Le thème de base gère le caret rotatif, le fond au survol et l'indentation de 18 px via les variables --amc-*.

Widgets d'affichage

Constructeur HTML WinForms
Element.ProgressBar(value, max) <progress> ProgressBar (value < 0 = indéterminé)
Element.Image(src) <img> PictureBox / Image
Element.PictureBox(src) <img> (alias) PictureBox
Element.Iframe(url) <iframe> WebBrowser
Element.MonthCalendar(name, year, month) grille (<table>) + en-tête ◀ / mois / année / ▶ MonthCalendar (v0.0.9 + navigateur v0.0.10)
Element.Row()
    .AddChild(Element.Label("Loading:").Size(80, 0))
    .AddChild(Element.ProgressBar(42, 100))

Element.MonthCalendar("birthday", 2026, 5)

MonthCalendar (v0.0.9) affiche une grille mensuelle intégrée. L'en-tête (v0.0.10) porte ◀ / menu déroulant mois / menu déroulant année / ▶ pour permettre à l'utilisateur de naviguer directement vers n'importe quel mois ou année. Cliquer sur un jour le met en surbrillance et transmet la sélection sous forme de chaîne ISO YYYY-MM-DD sous la clé name du widget dans le payload du formulaire (la clé est absente si aucun jour n'est sélectionné).

La MenuBar rendue en HTML, compatible tous OS — même forme que le MenuStrip de WinForms, thématisée avec --amc-*. Une variante native OS (Win32 HMENU / NSMenu / GtkMenuBar) est prévue en opt-in via data-mode="native" en v0.1.0 ; l'API est d'ores et déjà compatible vers l'avant.

Constructeur Rôle WinForms
Element.MenuBar() Conteneur <nav> — barre de menus en haut de fenêtre. MenuStrip
Element.MenuItem(label) Élément de premier niveau avec un panneau déroulant — en interne un <details> dont le <summary> est le libellé. ToolStripMenuItem
Element.MenuOption(label, actionName) <button> dans un menu déroulant qui appelle window.<actionName>('') au clic. ToolStripMenuItem (feuille)
Element.MenuSeparator() <hr> thématisé entre les options. ToolStripSeparator
Element.ContextMenu(targetId) Menu contextuel au clic droit — réutilise MenuOption / MenuSeparator. ContextMenuStrip
Element.MenuBar()
    .AddChild(Element.MenuItem("File")
        .AddChild(Element.MenuOption("New",   "amc_new"))
        .AddChild(Element.MenuOption("Open…", "amc_open"))
        .AddChild(Element.MenuSeparator())
        .AddChild(Element.MenuOption("Quit",  "amc_quit")))
    .AddChild(Element.MenuItem("Edit")
        .AddChild(Element.MenuOption("Undo",  "amc_undo")))

Liez chaque nom d'action via win.Bind("amc_new", handler). Un écouteur click global ferme tout menu ouvert lorsque l'utilisateur clique en dehors ; Escape ferme à la fois les menus déroulants de la barre de menus et le menu contextuel.

ContextMenu se rattache à l'élément hôte dont vous passez l'id et écoute l'événement DOM contextmenu :

let cm = Element.ContextMenu("workspace")
    .AddChild(Element.MenuOption("Cut",   "amc_cut"))
    .AddChild(Element.MenuOption("Copy",  "amc_copy"))
    .AddChild(Element.MenuSeparator())
    .AddChild(Element.MenuOption("Paste", "amc_paste"))

Element.Div().Id("workspace").Class("amc-ctx-target")
    .AddChild(cm)
    .AddChild( … your actual content … )

Conteneurs et mise en page

Ces éléments ne portent pas de données, ils organisent les enfants. Référence complète dans 04-layout-and-theme.md.

Constructeur Rôle
Element.Div() Conteneur bloc générique.
Element.Panel() Alias de Div (nom WinForms).
Element.Stack() Colonne flex avec un espacement de 8 px.
Element.Row() Ligne flex avec un espacement de 8 px.
Element.Flow(direction) Flex avec retour à la ligne — "row" ou "column".
Element.Grid(rows, cols, gap) CSS Grid. Passez rows=0 pour un nombre de lignes implicite.
Element.AbsoluteContainer() Parent position:relative pour les enfants avec .Position(x, y).
Element.GroupBox(title) <fieldset><legend> — section avec titre.
Element.TabControl(group) + Element.Tab(group, id, label, body) Onglets CSS purs (radio + sélecteur de frère).
Element.SplitContainer(orientation, ratio) Conteneur redimensionnable à deux volets (v0.0.8).
Element.ToolStrip() Rangée de boutons horizontale thématisée.
Element.StatusStrip() Barre d'état fixée en bas.
Element.GroupBox("Personal info")
    .AddChild(Element.Input("name").Attr("placeholder", "Name"))
    .AddChild(Element.Input("email").Attr("placeholder", "Email"))

SplitContainer (v0.0.8) prend une orientation ("row" → gauche/droite avec un séparateur vertical, "column" → haut/bas) et un ratio initial en pourcentage de 5 à 95 (par ex. 30 pour un découpage 30/70). Le séparateur est déplaçable à la souris, au stylet ou au toucher :

Element.SplitContainer("row", 30)
    .AddChild(Element.Stack().AddChild( … left pane … ))
    .AddChild(Element.Stack().AddChild( … right pane … ))

Boîtes de dialogue (v0.0.6 → v0.0.8)

Boîtes de message modales et sélecteurs de fichiers. Tous les points d'entrée sont des méthodes statiques sur Dialog, pas des constructeurs Element — ils ne s'insèrent pas dans l'arbre de la page ; ils s'affichent à la demande.

Boîtes de message (v0.0.6)

Appel Boutons Équivalent WinForms
Dialog.Info(win, title, message, handler) OK MessageBox.Show(... Information)
Dialog.Warning(win, title, message, handler) OK MessageBox.Show(... Warning)
Dialog.Error(win, title, message, handler) OK MessageBox.Show(... Error)
Dialog.Confirm(win, title, message, handler) OK/Cancel MessageBox.Show(... OKCancel)
Dialog.YesNoCancel(win, title, message, handler) Yes/No/Cancel MessageBox.Show(... YesNoCancel)
Dialog.Show(win, kind, title, message, buttons, handler) au choix bas niveau

Le handler reçoit l'id du bouton cliqué dans req"ok" / "cancel" / "yes" / "no" — ou "cancel" si l'utilisateur ferme avec Echap ou un clic sur l'arrière-plan.

Dialog.Confirm(win, "Quit?", "Discard unsaved changes?",
    (req: string) => {
        if (req == "ok") { win.Terminate() }
        return ""
    })

L'implémentation utilise l'élément HTML <dialog> — le piège de focus, la fermeture par Echap et le voile d'arrière-plan sont fournis gratuitement par le navigateur. L'en-tête porte un accent coloré (bleu / orange / rouge) selon le type.

Sélecteurs de fichiers (v0.0.7 + v0.0.8)

Appel Ce que reçoit le handler Remarques
Dialog.OpenFile(win, accept, handler) chaîne nom de fichier (ou "" en cas d'annulation) Bac à sable navigateur : nom de fichier uniquement, sans chemin.
Dialog.OpenFileContent(win, accept, binary, handler) (v0.0.8) JSON {"name":"…","content":"…"} (texte ou base64) binary=truereadAsDataURL puis suppression du préfixe.
Dialog.SaveFile(win, filename, content, mimeType, handler) "ok" une fois le téléchargement initié Bac à sable : impossible de savoir si l'utilisateur a accepté Enregistrer sous.
Dialog.OpenFileContent(win, ".txt,.json", false,
    (payload: string) => {
        // payload = ""  on cancel
        // payload = {"name":"notes.txt","content":"Hello, file…"} on success
        return ""
    })

Sorties de secours

Lorsqu'aucun constructeur ne convient :

// 1. Use a raw HTML tag — same fluent API as the builders.
new Element("aside")
    .Class("my-side-panel")
    .AddChild(Element.Label("Custom widget"))

// 2. Inject raw HTML inside an element.
Element.Div().Id("plot").Raw("<svg width=200 height=200>...</svg>")

Les deux formes produisent du HTML ordinaire ; le pont de collecte automatique fonctionne toujours pour tout [name] input à l'intérieur.

Pour des sorties de secours plus avancées — bibliothèques JS, primitives C personnalisées, surcharges CSS thématisées — voir 05-extending.md.

Accesseurs de propriétés (sur tout Element)

Miroir du panneau Propriétés du concepteur WinForms. Chacun retourne this pour permettre l'enchaînement.

Accesseur Rôle
.SetText(t) Contenu texte interne.
.Id(id) Id HTML. Obligatoire lorsque ciblé par OnResult / AppendInner.
.Class(cls) Classe CSS. Plusieurs classes autorisées (séparées par des espaces).
.Style(css) Ajoute du CSS en ligne. Cumulatif — plusieurs appels se superposent.
.Attr(name, value) Définit n'importe quel attribut HTML (sortie de secours). Remplace en cas de clé dupliquée (depuis v0.0.8).
.Size(w, h) Taille en pixels ; 0 sur un axe laisse la valeur non définie.
.Position(x, y) Placement absolu (à utiliser dans AbsoluteContainer).
.Visible(b) False → display:none.
.Enabled(b) False → désactivé + grisé.
.Tooltip(t) Infobulle native de l'OS (attribut title).
.TabIndex(n) Ordre de focus clavier.
.ForeColor(css) Raccourci pour color: (accepte #hex, var(--amc-...), nommé).
.BackColor(css) Raccourci pour background:.
.Font(family, sizePx) Raccourci pour font-family + font-size.
.DataTag(payload) Aller-retour d'une chaîne arbitraire via l'attribut data-tag.
.Fill() Marque cet enfant comme cible flex-grow / défilement dans son parent.
.Bind(name) Clé de formulaire déclarative (équivalent à .Attr("name", name)).
.Raw(html) Ajoute un fragment HTML brut comme enfant.

Pour les événements (.OnClick, .OnChange, .OnFocus, …) voir 03-events-and-state.md.