FrançaisEnglish

amalgame-ui-web — guide du développeur

Créez des interfaces graphiques de bureau à l'apparence native dans Amalgame, rendues par le moteur webview du système d'exploitation (WebView2 sur Windows, WKWebView sur macOS, WebKitGTK sur Linux).

Ce guide est le point d'entrée pour tout ce dont vous avez besoin pour livrer une application — installation, catalogue de widgets, modèle d'événements, mise en page, thématisation, mises à jour partielles du DOM, et les échappatoires pour HTML/CSS/JS personnalisés.

Pour la correspondance des contrôles WinForms et la vue d'ensemble architecturale, consultez les docs associées :

Ordre de lecture

Fichier Sujet
01-getting-started.md Installation, prérequis, création de la première fenêtre, script de build.
02-widgets.md Catalogue de chaque builder de widget Element.* avec des exemples.
03-events-and-state.md OnClick, OnChange, OnResult, événements personnalisés, payload JSON de formulaire, patching partiel du DOM.
04-layout-and-theme.md Stack / Row / Grid / Flow / Absolute / TabControl, FillViewport, les sept variables CSS.
05-extending.md Element.Raw, intégration d'une lib JS (Plotly / Tabulator / CodeMirror), primitives côté C, échappatoires natives.

Application minimale

Deux formes équivalentes — l'explicite Window + Page et le sucre syntaxique Form + Application.Run (v0.0.7).

Forme explicite

import Amalgame.UI.Web

class Program {
    public static void Main() {
        let win: Window = new Window("Hello", 480, 320, false)
        if (!win.IsValid()) { return }

        Page.New()
            .SetTitle("Hello")
            .SetBody(
                Element.Stack()
                    .AddChild(Element.Heading("Hello, Amalgame"))
                    .AddChild(Element.Button("Click me")
                        .OnClick((req: string) => "\"clicked\"")
                        .OnResult("out"))
                    .AddChild(Element.Pre("").Id("out"))
            )
            .ApplyTo(win)

        win.Run()
        win.Destroy()
    }
}

Sucre syntaxique Form

import Amalgame.UI.Web

class Program {
    public static void Main() {
        let f: Form = new Form("Hello", 480, 320)
        f.SetBody(
            Element.Stack()
                .AddChild(Element.Heading("Hello, Amalgame"))
                .AddChild(Element.Button("Click me")
                    .OnClick((req: string) => "\"clicked\"")
                    .OnResult("out"))
                .AddChild(Element.Pre("").Id("out"))
        )
        Application.Run(f)
    }
}

Build (Linux/Ubuntu, voir 01-getting-started.md pour macOS / Windows) :

amc package add ui-web
./build.sh && ./hello

Thème système (clair / sombre suit le bureau), handler de clic lié à la closure AM, retour JSON affiché formaté dans #out. Aucun HTML écrit à la main.

Ce que ce package est et n'est pas

Est :

N'est pas :

Modèle mental

┌──────────────────────────────────────────────────┐
│ Amalgame code                                    │
│   - builds an `Element` tree via fluent calls    │
│   - attaches OnClick / OnChange handlers (AM)    │
│   - calls `Page.New().ApplyTo(win)` once         │
│   - reacts to events with handlers + AppendInner │
└─────────────────────┬────────────────────────────┘
                      │ Page.Render → HTML string
                      │ Window.Bind → JS shim per handler
                      ▼
┌──────────────────────────────────────────────────┐
│ Webview (WebView2 / WKWebView / WebKitGTK)       │
│   - renders HTML + CSS + JS                      │
│   - user clicks → JS shim → Amalgame closure     │
│   - closure returns a value → routed via         │
│     OnResult or discarded                        │
└──────────────────────────────────────────────────┘

Si vous avez utilisé Tauri ou Electron, l'idée est identique — interface webview côté front, back-end natif — mais le front est généré à partir de code Amalgame typé plutôt qu'écrit en HTML à la main.