Softanza
DémarrerEnglish
Softanza
Visuel et spatial

Interface et réactif

Un jeune plan RmlUi, remarquable en droite-à-gauche et en accessibilité ; le moteur réactif n'est pas encore relié à la vue.

2 Strong · 6 Solid · 4 Partial · 0 Emerging

Mesuré contre : Qt · GTK · Flutter · React · Dossiers : base/gui(s'ouvre dans un nouvel onglet) · base/reactive(s'ouvre dans un nouvel onglet) · base/app(s'ouvre dans un nouvel onglet) · Pour les programmeurs : la référence de ce domaine

une fenêtre mise en page par le plan des interfaces : tuiles, texte replié, alignement et droite-à-gauche
une fenêtre mise en page par le plan des interfaces : tuiles, texte replié, alignement et droite-à-gauche. rendu par la propre garde du plan, déposé dans la bibliothèque au commit 0fbaa692a sous base/test/gui/gui_gallery.png, lu au commit 4a184e6f0 · la source(s'ouvre dans un nouvel onglet)

Repensé depuis les premiers principes

Ce que Softanza a gardé de ce qui marche, et ce qu'elle a repensé, tel que la bibliothèque l'a écrit dans ses documents de conception et ses narrations.

La manière SoftanzaLes déclarations Softanza font contrat ; le balisage que lit le moteur d'interface n'en est qu'une projection, générée et jamais écrite à la main.

Gardé des meilleures pratiques

  • La mise en page et la saisie viennent de RmlUi plutôt que d'une boîte à outils maison. Il a été choisi pour sa licence permissive, son rendu fourni par l'hôte, l'absence de JavaScript et un vrai modèle de saisie. source(s'ouvre dans un nouvel onglet)
  • Le format de description reprend une idée de QML : chaque élément est un nom doté de propriétés typées. Les éléments anonymes imbriqués sont refusés, donc chaque boîte a un nom. source(s'ouvre dans un nouvel onglet)
  • Le travail asynchrone repose sur libuv, boucle d'événements multiplateforme éprouvée, plutôt que sur un réacteur fait maison. Les scripts soumettent et récupèrent leur travail, sans jamais être rappelés. source(s'ouvre dans un nouvel onglet)

Repensé

  • Le balisage est généré, jamais écrit à la main. Un fichier .panel fait contrat ; RmlUi et HTML n'en sont que des projections, car le balisage manuel échappe aux contrôles. source(s'ouvre dans un nouvel onglet)
  • L'arbre d'accessibilité est produit à partir de l'intention déclarée, non deviné depuis le balisage, ce qui informe mieux les lecteurs d'écran. Tout élément focalisable a un rôle et un nom. source(s'ouvre dans un nouvel onglet)
  • Le code réactif s'exprime en mots simples, des fonctions qui attendent, des valeurs qui se mettent à jour seules, plutôt qu'en métaphores comme rappels et abonnés, qui masquent un flux simple. source(s'ouvre dans un nouvel onglet)
  • Une application est un monde vivant, porteur de sens : un domaine, une vie tendue vers des buts, un corps. Fichiers, base de données et interface n'en sont que la tuyauterie. source(s'ouvre dans un nouvel onglet)

A young but genuinely coherent GUI plane, built on vendored RmlUi and actually running — windows open, events flow, it renders through the GPU plane and an SVG tier. Two standouts reflect the library's DNA: RTL/bidi fully owned and accessibility built in from the grammar up. The rest is early: a four-primitive vocabulary, flexbox-only layout, imperative view-binding, and a full reactive runtime that ships but is not yet wired to the GUI. The whole plane is on local main only, not yet pushed.

Ce qu'un artisan en fait, et ce qui se distingue

  • RTL/bidi fully owned end to end
  • accessibility mandatory at authoring time, exposed via AccessKit
  • a recorder-not-painter render model with a deviceless SVG tier
  • an event surface that counts dropped events

Ce qui est dû

  • wire the reactive runtime to the GUI (G5 clause 2)
  • a richer widget set
  • the semantic theme system (G6)
  • IME & two-way text editing

La manière Softanza, exécutée

Ce que Softanza fait autrement dans ce domaine, montré par du code tiré de ses narrations et de ses gardes, et exécuté pour cette page.

Un seul mot déclaré, rtl, est traduit dans la propriété de direction propre au moteur : l'auteur n'écrit jamais le balisage du moteur à la main.

Softanza
oRtl = new stzUiDocument(
	'DEFINE PANEL p ( FONT "app", CHILDREN [r] ) RATIONALE "x"' + char(10) +
	'DEFINE BOX r ( TEXT_DIRECTION rtl, HEIGHT 20 ) RATIONALE "x"')
chk("TEXT_DIRECTION rtl becomes --rmlui-direction",
    StzFindFirst("--rmlui-direction: rtl", oRtl.ToRml()) > 0)
chk("...and never the CSS spelling RCSS rejects",
    StzFindFirst("; direction:", oRtl.ToRml()) = 0)
Sortie
  [OK] TEXT_DIRECTION rtl becomes --rmlui-direction
  [OK] ...and never the CSS spelling RCSS rejects

exécuté le 2026-10-01 21:18 dans la bibliothèque au commit 0e72e2e2c ; tiré de base/test/gui/gui_stzui_narrated.ring(s'ouvre dans un nouvel onglet)

Une application se déclare comme un monde de choses, de vérités et de relations, et elle s'explique elle-même en texte clair.

Softanza
oApp = new stzApp("SonibankVisits")
oApp {
    AddThingQ(:Account) { Has([ :number, :chapter, :balance ])  IsTrue(:balance, "@ >= 0") }
    AddThingQ(:Client)  { Has([ :code, :name, :city ])  Owns(:Account) }
    AddThingQ(:Visit)   { Of(:Client)  Has([ :agent, :date, :subject ]) }
    AddRelation(:Account, :belongsTo, :Client)
}
oApp.Explain()
Sortie
WORLD SonibankVisits   lives in: memory (not persisted)
  BEING
    account (number, chapter, balance)
        true when balance @ >= 0
    client (code, name, city)
    visit (agent, date, subject)
  RELATIONS
    client owns account
    visit of client
    account belongsto client

exécuté le 2026-10-01 21:18 dans la bibliothèque au commit 0e72e2e2c ; tiré de base/test/app/00_stzapp_narrated.ring(s'ouvre dans un nouvel onglet)

Les couloirs, un par un

Les couloirs et leurs notes sont cités tels qu'ils ont été lus à la source, le Read from the source on 2026-09-16, from a read-only main worktree.

RTL & bidirectional text
Strong
Fully owned (RmlUi does no bidi): stzUiDocument reverses flex rows under RTL; gpu_text.zig reorders with SheenBidi (UAX#9) and shapes Arabic with HarfBuzzstzUiDocument / gpu_text.zig; test/gui RTL suite
Accessibility
Strong
G4a: a mandatory RATIONALE on every element emits an ARIA-role tree; G4b: a11y.zig hands that tree to AccessKit (UIA / NSAccessibility / AT-SPI)stzAccessibilityTree / a11y.zig
Declarative authoring (.panel)
Solid
A closed four-kind grammar PANEL/BOX/TEXT/STYLE, a diagnostics court, a .panel->RML->.panel round-trip fixpoint; far narrower than peer component modelsstzUiDocument
Layout
Solid
RmlUi flexbox via RCSS: direction, wrap, gap, align, justify, px/%/fill sizing; CSS Grid refused by decision, no constraint or custom layoutstzUiDocument::ToRml()
Rendering backend
Solid
RmlUi's render interface is a recorder, not a painter (stz_rmlui.cpp): one flat display list drawn by the GPU tier or an SVG tier; PNG needs a GPU devicestz_rmlui.cpp
Event handling
Solid
Pointer, key, text-input, focus and directional focus move, hit-testing (element_at), an event recorder that counts dropped events; no gesture recognitionstzPanel
Reactive runtime & signals
Solid
stzReactiveObject with Watch / Computed(deps) / BindTo / SetAttribute, streams, timers, HTTP, event bus on a libuv reactor; not yet reaching the viewbase/reactive; reactor.zig
App shell & windowing
Solid
Native windows via vendored GLFW (window.zig); stzApp is a declarative living world; no multi-window orchestration, dialogs, menus or system-traywindow.zig / stzApp
Widget / element toolkit
Partial
RmlUi's own form controls (input, select, textarea, progress, tabset, button); no tables, trees, menus, dialogs, pickers, toolbars, docking
State->view binding
Partial
{placeholder} templates and Set/SetStyle/Apply mutate a live document preserving focus, values escaped as data; imperative, not reactivestzUiBindings (G5 clause 1)
Text input & IME
Partial
Single-line text input works (stz_gui_text_input); no IME, composition input for CJK and complex scripts deferred (costed at 1-3 engineer-years)
Theming & animation
Partial
Inline styling (BACKGROUND, COLOR, STYLE bags -> RCSS) and a profile layer; no semantic theme system (G6 not started) and no animation/transitions